Data preparation script for Sierra Nevada time series analysis

Fig. 7. Respiration data from incubations of 2019 and 2001 bulk soils.

Caption: Points show measured CO2 production of laboratory duplicates as cumulative fluxes or daily flux rates by depth, lines show the means, and the ribbon represents the range.

Merge templates with 14C, C, and N data

Radiocarbon analyses for the 2001 samples were not run originally, but were completed on archived samples in 2020.

Fig. 7. Litter incubation \(\Delta\)14C-CO2 (2019)

Caption: Mean \(\Delta\)14C-CO2 for each site. Error bars show min and max of duplicate incubation samples. a) Data shown by site, without litter depth, b) Data shown by depth of litter layer, binned by climate zone.

2001 mean radiocarbon profiles

Fig. 7. Mean profile \(\Delta\)14C for 2001 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

2009 radiocarbon profiles

Fig. 7. Profile \(\Delta\)14C for 2009 samples

Caption: Profile \(\Delta\)14C by depth for each site in 2009. Solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling. Error bars not shown as only a single replicate profile was analyzed per site.

2019 mean radiocarbon profiles

Fig. 7. Mean profile \(\Delta\)14C for 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2019. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

Change in \(\Delta\)14C over time between 2001 and 2019

Fig. 7. Mean profile \(\Delta\)14C for 2001 and 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001 and 2019. Error bars show ±1 standard deviation. Vertical lines show \(\Delta\)14C of the atmosphere in 2001 (solid) and 2019 (dashed).

Incubation \(\Delta\)14C-CO2

Fig. 7. \(\Delta\)14C-CO2 of 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2019. One rep from GRrf 10-20 (the 10-20 cm increment sample from the cold granite site) is strongly depleted relative to the other rep: \(\Delta\)14C-CO2 = -396.7, -23.5. The highly depleted sample has been excluded for display reasons.

Fig. 7. \(\Delta\)14C-CO2 of 2001 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001. Note that some sites only have two depth increments. Similar to the 2019 dataset, one of the GRrf reps from the deepest depth increment was strongly depleted: \(\Delta\)14C-CO2 = -469.1. Both points have been excluded for display reasons.

Fig. 7. \(\Delta\)14C-CO2 of 2001 and 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001 and 2019. Different depth increments were sampled in 2001 and 2019. Points are the mean of laboratory duplicates; error bars are the measured values of each duplicate. Granite/cold point exlcuded for display reasons as it is strongly depleted.

Incubation vs. bulk soil \(\Delta\)14C

Error in save(sra.01.inc.blk, file = "sra.01.inc.blk.RData") : 
  object ‘sra.01.inc.blk’ not found

Fig. 7. \(\Delta\)14C of 2019 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Fig. 7. \(\Delta\)14C of 2001 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2001. Points show mean of three replicate profiles for bulk soils and mean of laboratory duplicates for respired CO2. The incubated soil samples are a composite made by homogenizing subsamples from each of the three replicate profile samples by depth. Error bars show one standard deviation for bulk soil and the measured values from laboratory duplicates of the incubated composite samples.


Call:
lm(formula = d14c_mean.inc ~ d14c_mean.bulk * PM, data = sra.all.sum.df[sra.all.sum.df$d14c_mean.inc > 
    -200, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-48.585 -19.180  -7.747  22.186  67.693 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          71.7999     7.4744   9.606 3.67e-12 ***
d14c_mean.bulk        0.5137     0.1436   3.576 0.000894 ***
PMBS                -22.4831    10.5006  -2.141 0.038112 *  
PMGR                -49.6173    12.2047  -4.065 0.000206 ***
d14c_mean.bulk:PMBS   0.3595     0.2215   1.623 0.112049    
d14c_mean.bulk:PMGR   0.4387     0.1974   2.222 0.031731 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 28.85 on 42 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:   0.68, Adjusted R-squared:  0.6419 
F-statistic: 17.85 on 5 and 42 DF,  p-value: 1.859e-09

Fig. 7. Regression of 2019 bulk soil incubations and corresponding bulk soil \(\Delta\)14C

Caption: Regressions of \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Time series: \(\Delta\)14C by depth (as measured)

Fig. 7. Time series of \(\Delta\)14C by depth, as measured

Caption: Points show mean of three profile replicates for 2001, 2009, and 2019 samples. Error bars show ± 1 standard deviation of the mean (only a single profile was analyzed in 2009). Stars show litter incubation \(\Delta\)14C-CO2 for 2019 samples as a point of reference.

Spline fitting

Soils collected in both the 2001 and 2009 sampling campaigns were sampled by horizon, but the depth intervals differed between the two sampling years. In 2009, full profiles were excavated for each site, as opposed to the shorter profiles collected in 2001 from the GR and AN sites. Radiocarbon was measured on all three replicate profiles at each site for the 2001 samples, but only for one of the replicate profiles at each site in 2009, e.g. ANpp rep2, etc.

In order to compare the radiocarbon profiles between 2001, 2009, and 2019 we first interpolated both radiocarbon and carbon stock data at 1 cm intervals for each site in the datasets from each year. The carbon-stock-weighted radiocarbon values for any given target depth interval can then be calculated as a simple sum of the product of the carbon weight of each 1 cm increment (relative to the total carbon stock of the target depth interval) and its radiocarbon value. A monotonic cubic spline fit was used for the carbon stock interpolation (Wendt and Hauser 2013), and a mass-preserving spline was used to fit the radiocarbon data (Bishop, T.F.A., McBratney, A.B., Laslett, G.M., (1999) Modelling soil attribute depth functions with equal-area quadratic smoothing splines. Geoderma, 91(1-2): 27-45).

Fig. 7. Time series of bulk soil \(\Delta\)14C by 2001 depths (2001, 2009, 2019 samples)

Caption: Points for 2001 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2009 and 2019 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2001. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009).

Fig. 7. Time series of bulk soil \(\Delta\)14C by depth (splined to 2019 depths)

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009). NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

$`10`

$`20`

$`30`

Fig. 7. Change in \(\Delta\)14C of bulk soil (panel a) and respired CO2 (panel b) over time relative to the atmosphere

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 (bulk only) samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars for bulk samples in panel (a) show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009); error bars for incubation samples in panel (b) show the values of the two reps, while the point represents the mean. NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Initial modeling

The goal of this modeling exercise is to see how parent material and climate/ecosystem affect estimates of soil carbon ages and transit times. Bulk soil 14C observations from 2001, 2009, and 2019 will be used to constrain the carbon models, as well as observations of 14C-CO2 from laboratory soil incubations of soils collected in 2001 and 2019. Previous work has indicated that the carbon stocks at these sites is likely at equilibrium, so we will apply the steady-state assumption to the modeling.

Two-pool models

One pool models have been shown repeatedly to be inadequate for describing soil carbon dynamics. However, as simple models are easier to constrain, we will start with a two-pool parallel and two-series models, as these are the simplest model system beyond the single pool approach.

The two-pool parallel model requires the following parameters: * decomposition constants for each pool (k1, k2) * input partitioning coefficient (\(\gamma\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C 1 The two-pool series model requires the following parameters: * decomposition constants for each pool (k1, k2) * transfer coefficient (\(\alpha\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

Decomposition rates (k) are related to the amount of 14C in a pre-bomb system (fraction modern, F) at steady-state by the following equations (cf. Schuur, Druffle, and Trumbore, 2016): >Eq. 1

\[F = \frac{k}{k + \lambda}\] >Eq. 2

\[k = \frac{\lambda \cdot F}{1 - F}\] >where \(\lambda\) is the radioactive decay constant (1/8267).

As the decomposition rates will vary, the initial 14C content can be determined dynamically with equation 1.

Carbon stocks are known, while inputs will be estimated and are related to the steady-state conditions by the following equation: >Eq. 3

\[I = (k_{1} \cdot C_{1}) + (k_{2} \cdot C_{2})\] >where C1 and C2 are the carbon stocks of the two model pools.

Both stocks and inputs can be scaled to the known value of the total carbon pool once the steady-state parameters (k1, k2, and \(\gamma\) or \(\alpha\)) have been determined. Pool sizes are a function of the inputs and input partitioning coefficient at steady-state.

A Monte-Carlo Markov chain approach will be used for parameter estimation in combination with an initial optimization algorithm to determine the best set of initial parameters.

Workflow

Initial model fitting was performed for both model structures using generous parameter ranges [0, 1] for all three parameters (k1, k2, \(\gamma\) or \(\alpha\)). The initial parameter set was found by fitting the models by eye, followed by optimization with the function “modFit” (R package FME), using the Nelder-Mead algorithm. The best set of parameters found by modFit was then used as the input to a Monte Carlo Markov Chain (MCMC), using the function “modMCMC” (R package FME). The number of iterations for the MCMC optimization was set at 5000 intially, with delayed rejection employed to increase efficiency.

The sum of the mean squared error for the best parameter set was slightly lower for the parallel structure than for the series structure. Additionally, the overall mean error of the residuals was also lower for the parallel structure, moderately so for the bulk C observations but substantially so for the respiration observations (in andesite and granite soils in particular).

However, these initial fits yielded unrealistic parameter estimates for multiple sites, particularly at the lower depths. Additionally, the modFit output showed very high correlation between the parameters for both model structures (slightly higher for the two-pool series model).

Parameter optimization

Optimizing the parameter set requires imposing costs and optionally constraining the allowable range of values for each parameter. Given that we only have data for three time points, this is a relatively sparse data set for constraining these models. Accordingly, the optimization procedure will benefit from a priori constraints of the allowable parameter ranges. For example, since we assume that the system cannot be adequately modeled as a single homogenous reservoir, we will ensure that the optimization procedure cannot collapse the two-pool system into a single pool. This can be mitigated in the two-pool parallel optimization by constraining \(\gamma\) (i.e. the percentage of the inputs entering the fast pool) to a range of 50% to 95%. Similarly, for the two-pool series model structure we can constrain the range of the transfer coefficient to be between 0.0 and 0.1, ensuring that some carbon remains in the fast cycling pool.

Additionally, to enforce a relatively fast cycling pool and relatively slower cycling pool, we will loosely constrain the intrinsic decomposition rates as well (both model structures):

k1: [0.02, 1.00] (50 to 1 year) k2: [0.0001, 0.02] (10,000 to 50 years)

Finally, the models will be run to enforce steady-state, i.e. with unvarying carbon stocks. The amount of carbon observed in the system will be used in the cost function in addition to the radiocarbon observations made in 2001, 2009, and 2019. The inputs will be estimated from net ecosystem exchange (NEE) data measured at nearby eddy covariance sites: Blodgett experimental forest (AmeriFlux), Lower Teakettle (NEON), and Soaproot Saddle (NEON). Alternatively, using correlations between fluxes measured from these eddy covariance towers and GPP estimated from satellite retrievals of SIF, estimates can be made for inputs at the pixels corresponding to each site location.

Error in lapply(mod.fits.2pp3, "[[", 1) : 
  object 'mod.fits.2pp3' not found
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

Bayesian parameter estimation (MCMC)

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBUaW1lIFNlcmllcyIKYXV0aG9yOiAiSi4gQmVlbS1NaWxsZXIiCmRhdGU6ICIyMSBPY3QgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBjc3M6IGN1c3RvbS5jc3MKaGVhZGVyX2luY2x1ZGVzOgogIC0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CiAgLSBcdXNlcGFja2FnZXtmbG9hdH0KLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9ICdjYWlyb19wZGYnKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKIyBzdXBwcmVzcyBncm91cGluZyBpbmZvcm1hdGlvbiBtZXNzYWdlCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQpsaWJyYXJ5KElTUmFEKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KEZNRSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ3QpCmBgYAoKIyBEYXRhIHByZXBhcmF0aW9uIHNjcmlwdCBmb3IgU2llcnJhIE5ldmFkYSB0aW1lIHNlcmllcyBhbmFseXNpcwoKYGBge3IgbG9hZCBhbXMtamVuYS1pbmdlc3QgZnh9CiMgMS4gUmVhZCBpbiBpc290b3BlIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMKIyBGaXJzdCBsb2FkIGhlbHBlciBmdW5jdGlvbnMgJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SJywgJ3JlYWRfamVuYV9pc29fcmVzdWx0cy5SJyAKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9pc29faW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfZWxtX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkLWNuLWlzby1kYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgIyAxM0MKIyAjIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJpc29famVuYSIgaW4gbmFtZQojIGlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQojIGlzb19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoaXNvX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewojICAgcmVhZF9qZW5hX2lzb19yZXN1bHRzKGlzb19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKIyB9KQojIG5hbWVzKGlzb19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIpCgojIFJlYWQgaW4gQyBhbmQgTiBkYXRhCmVsbV9yZXN1bHRzX2RpciA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQplbG1fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGVsbV9yZXN1bHRzX2RpciksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfZWxtX3Jlc3VsdHMoZWxtX3Jlc3VsdHNfZGlyW2ldKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGRhdGEtdGVtcGxhdGV9CiMgQ3JlYXRlIHRlbXBsYXRlIGZvciBidWxrIHNvaWwgZGF0YQp0ZW1wbGF0ZTE5LmZ4IDwtIGZ1bmN0aW9uKHBtLCBlY28sIG5kZXB0aCkgewogIGRmIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKHBtLCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IHJlcChzZXEoMSwzKSwgZWFjaCA9IG5kZXB0aCksCiAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gcmVwKHNlcSgwLCAobmRlcHRoLTEpICogMTAsIGJ5ID0gMTApLCAzKSwKICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSByZXAoc2VxKDEwLCAobmRlcHRoKSAqIDEwLCBieSA9IDEwKSwgMykpCiAgZGYkcHJvX25hbWUgPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08sICJfIiwgZGYkcHJvX3JlcCkKICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogIHJldHVybihkZikKfQoKIyBDcmVhdGUgdGVtcGxhdGUgZm9yIGNvbXBvc2l0ZSBzb2lsIGRhdGEgKGluY3ViYXRpb25zLCBkZW5zaXR5IGZyYWN0aW9ucywgZXRjLikKdGVtcGxhdGUuY29tcC5meCA8LSBmdW5jdGlvbih5ZWFyLCBwbSwgZWNvLCBkZXB0aF9ib3QgPSBjKDEwLCAyMCwgMzApLCBkYXQpIHsKICBuZGVwdGggPC0gbGVuZ3RoKGRlcHRoX2JvdCkKICBkZiA8LSBkYXRhLmZyYW1lKFllYXIgPSByZXAoeWVhciwgbmRlcHRoICogbGVuZ3RoKHBtKSksCiAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChwbSwgZWFjaCA9IG5kZXB0aCAqIGxlbmd0aChlY28pKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIGVhY2ggPSBuZGVwdGgpKQogIGRmJGx5cl9ib3QgPC0gZGVwdGhfYm90CiAgZGYkbHlyX3RvcCA8LSBzYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIGlmIChpID09IDEpIHsKICAgICAgZGVwdGhfdG9wIDwtIDAKICAgICAgfSBlbHNlIHsKICAgICAgICBkZXB0aF90b3AgPC0gZGVwdGhfYm90W2kgLSAxXQogICAgICB9CiAgfSkKICBkZiRwcm9fbmFtZSA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wIikKICBuIDwtIG5yb3coZGYpCiAgaWYgKGRhdCA9PSAiaW5jIikgewogICAgZGYgPC0gcmJpbmQoZGYsIGRmKQogICAgZGYkcmVwIDwtIHJlcChjKCJhIiwgImIiKSwgZWFjaCA9IG4pCiAgICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkbHlyX3RvcCwgIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfYm90LCAiXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJFllYXIsICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRyZXApCiAgfSBlbHNlIGlmIChkYXQgPT0gImRlbnNpdHkiKSB7CiAgICBkZiA8LSByYmluZChkZiwgZGYsIGRmKQogICAgZGYkZnJjIDwtIHJlcChjKCJmTEYiLCAib0xGIiwgIm1uQyIpLCBlYWNoID0gbikKICAgIGRmJGx5cl9uYW1lIDwtIHBhc3RlMChkZiRwcm9fbmFtZSwgIl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfdG9wLCAiLSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGx5cl9ib3QsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkWWVhciwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGZyYykKICB9CiAgcmV0dXJuKGRmKQp9CgojIHRlbXBsYXRlcyBmb3IgYnVsayBzb2lsIGRhdGEKIyBHUnJmIApHUnJmIDwtIHRlbXBsYXRlMTkuZngoIkdSIiwgInJmIiwgNykKR1JyZiA8LSBpZihhbnkoR1JyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIikpIHsKICBHUnJmIDwtIEdScmZbLXdoaWNoKEdScmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpLCBdICMgTkI6IEdScmZfMV82MF83MCBkb2Vzbid0IGV4aXN0Cn0gZWxzZSB7CiAgR1JyZiA8LSBHUnJmCn0KIyBHUndmCkdSd2YgPC0gdGVtcGxhdGUxOS5meCgiR1IiLCAid2YiLCA5KQojIEdScHAKR1JwcCA8LSB0ZW1wbGF0ZTE5LmZ4KCJHUiIsICJwcCIsIDgpCgojIEFOcmYgCkFOcmYgPC0gdGVtcGxhdGUxOS5meCgiQU4iLCAicmYiLCA2KQojIEFOd2YKQU53ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJBTiIsICJ3ZiIsIDYpCiMgQU5wcApBTnBwIDwtIHRlbXBsYXRlMTkuZngoIkFOIiwgInBwIiwgOCkKCiMgQlNyZiAKQlNyZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJyZiIsIDgpCkJTcmYgPC0gaWYoYW55KEJTcmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpKSB7CiAgQlNyZiA8LSBCU3JmWy13aGljaChCU3JmJGx5cl9uYW1lID09ICJCU3JmXzFfNzBfODAiKSwgXSAjIE5COiBCU3JmXzFfNzBfODAgZG9lc24ndCBleGlzdAp9IGVsc2UgewogIEJTcmYgPC0gQlNyZgp9IAojIEJTd2YKQlN3ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJ3ZiIsIDcpCiMgQlNwcApCU3BwIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgInBwIiwgOCkKQlNwcFtCU3BwJGx5cl9ib3QgPT0gODAsICJseXJfYm90Il0gPC0gNzUgIyBvbmx5IHNhbXBsZWQgdG8gNzVjbSwgbm90IDgwCgpzcmEuMjAxOS5kZiA8LSByYmluZChHUnJmLCBHUndmLCBHUnBwLAogICAgICAgICAgICAgICAgICAgICBBTnJmLCBBTndmLCBBTnBwLAogICAgICAgICAgICAgICAgICAgICBCU3JmLCBCU3dmLCBCU3BwKQoKIyB0ZW1wbGF0ZSBmb3IgMjAxOSBpbmN1YmF0aW9uIGRhdGEKc3JhLjIwMTkuaW5jLmRmIDwtIHRlbXBsYXRlLmNvbXAuZngoMjAxOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtID0gYygiQU4iLCAiQlMiLCAiR1IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gYygicHAiLCAid2YiLCAicmYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCgojIyB0ZW1wbGF0ZSBmb3IgMjAwMSBpbmN1YmF0aW9uIGRhdGEKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBpbmMgc2FtcGxlcwpkZXB0aF9ib3RfMjAwMS5scyA8LSBsaXN0KEFOcHAgPSBjKDYsIDEzLCAzMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQU53ZiA9IGMoMTEsIDM1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTnJmID0gYygxMSwgMzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcHAgPSBjKDcsIDE4LCAyOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlN3ZiA9IGMoMTAsIDE5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3JmID0gYyg4LCAxNSwgMzApLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScHAgPSBjKDcsIDE1LCAyNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1J3ZiA9IGMoNCwgMTMsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUnJmID0gYyg4LCAyNykpIAojIHRlbXBsYXRlIGZvciBpbnB1dHMgdG8gdGVtcGxhdGUuY29tcC5meCAoeWVhciwgcG0sIGVjbykKaW5jLjIwMDEudGVtcGxhdGUgPC0gbGFwcGx5KHNlcV9hbG9uZyhkZXB0aF9ib3RfMjAwMS5scyksIGZ1bmN0aW9uKGkpIHsKICBubXMgPC0gbmFtZXMoZGVwdGhfYm90XzIwMDEubHMpCiAgbHMgPC0gbGlzdCh5ZWFyID0gMjAwMSwgCiAgICAgICAgICAgICBwbSA9IHN1YnN0cihubXNbaV0sIDEsIDIpLCAKICAgICAgICAgICAgIGVjbyA9IHN1YnN0cihubXNbaV0sIDMsIDQpKQogIGxzJGRlcHRoX2JvdCA8LSBkZXB0aF9ib3RfMjAwMS5sc1tbaV1dCiAgcmV0dXJuKGxzKQp9KQojIGNyZWF0ZSB0ZW1wbGF0ZSBkYXRhIGZyYW1lIGJ5IGl0ZXJhdGl2ZWx5IGNhbGxpbmcgdGVtcGxhdGUuY29tcC5meApzcmEuMjAwMS5pbmMuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzZXFfYWxvbmcoaW5jLjIwMDEudGVtcGxhdGUpLCBmdW5jdGlvbihpKSB7CiAgICB0ZW1wbGF0ZS5jb21wLmZ4KHllYXIgPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgIHBtID0gaW5jLjIwMDEudGVtcGxhdGVbW2ldXVtbMl1dLAogICAgICAgICAgICAgICAgICAgICBlY28gPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1szXV0sCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2JvdCA9IGluYy4yMDAxLnRlbXBsYXRlW1tpXV1bWzRdXSwKICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCiAgfSkKKQoKIyAyMDAxIGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAwMSA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMSkgPC0gdW5pcXVlKHNyYS4yMDE5LmRmJHByb19uYW1lKQoKIyAyMDE5IGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAxOSA8LSBzcmEuMjAwMQoKIyBpbmMgdGVtcGxhdGVzIGZvciBtZXJnaW5nIDE0QyBkYXRhCnNyYS4yMDE5LmluYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpKSkKbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSB1bmlxdWUoc3JhLjIwMTkuaW5jLmRmJHByb19uYW1lKQpzcmEuMjAwMS5pbmMgPC0gc3JhLjIwMTkuaW5jCiMgY29waWVzIGZvciByZXBzIG9mIGluY3ViYXRpb25zCnNyYS4yMDE5LmluY19MIDwtIHNyYS4yMDE5LmluYwpuYW1lcyhzcmEuMjAxOS5pbmNfTCkgPC0gc3Vic3RyKG5hbWVzKHNyYS4yMDE5LmluY19MKSwgMSwgNCkKYGBgCgpgYGB7ciBhdmVyYWdlLWNuLWRhdGF9CiMgY29tcGxldGUgY2FzZXMsIGNvbnZlcnQgdHlwZSBmb3IgY2FsY3VsYXRpbmcgc3RvY2tzIGxhdGVyCiMgY291bGQgY2FsY3VsYXRlIHN0b2NrcyBub3cgYW5kIHRoZW4gcmVtb3ZlIGZvciB0aGUgZm9sbG93aW5nIHN0ZXBzIHdoZXJlIG5vdCBuZWVkZWQKCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBjcmVhdGUgbGlzdDsgcmVtb3ZlIEJTIHNhbXBsZXMgZGVlcGVyIHRoYW4gMzAgY20Kc29jLjIwMDEubHMgPC0gbGFwcGx5KHNwbGl0KHNvYy4yMDAxLCBzb2MuMjAwMSRQTWVjbyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gdHlwZS5jb252ZXJ0KGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgYygiSUQiLCAiQy4iLCAiYmQuZy5jbTMiLCAiUE1lY28iLCAicHJvX3JlcCIsICJseXJfdG9wIiwgImx5cl9ib3QiKV0pCiByZXR1cm4oZGZbd2hpY2goZGYkbHlyX2JvdCA8IDM2KSwgXSkKfSkKCiMgSW5jdWJhdGlvbiBzYW1wbGVzIGNvbWJpbmVkIDAtMyBhbmQgMy04IGRlcHRoIGluY3JlbWVudHMgZm9yIEJTcmYgYW5kIEdScmYKIyBjb21iaW5lIEJTcmYgYW5kIEdScmYgaW5pdGlhbCBkZXB0aHMKIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmaXJzdCB0d28gZGVwdGggaW5jcmVtZW50IEMgY29udGVudApkMWQyLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZDFkMiA8LSBkYXRhLmZyYW1lKElEID0gcGFzdGUoZGYkUE1lY29bMV0sIGRmJHByb19yZXBbMV0sIGRmJGx5cl90b3BbMV0sIGRmJGx5cl9ib3RbMl0sIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgIEMuID0gc3VtKGRmJEMuWzFdICogKChkZiRseXJfYm90WzFdIC0gZGYkbHlyX3RvcFsxXSkgLyBkZiRseXJfYm90WzJdKSwgZGYkQy5bMl0gKiAoKGRmJGx5cl9ib3RbMl0gLSBkZiRseXJfdG9wWzJdKSAvIGRmJGx5cl9ib3RbMl0pKSwKICAgICAgICAgICAgICAgICAgICAgYmQuZy5jbTMgPSBkZiRiZC5nLmNtM1sxXSwKICAgICAgICAgICAgICAgICAgICAgUE1lY28gPSBkZiRQTWVjb1sxXSwKICAgICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IGRmJHByb19yZXBbMV0sCiAgICAgICAgICAgICAgICAgICAgIGx5cl90b3AgPSBkZiRseXJfdG9wWzFdLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gZGYkbHlyX2JvdFsyXSkKICByZXR1cm4ocmJpbmQoZDFkMiwKICAgICAgICAgICAgICAgZGZbMzpucm93KGRmKSwgXSkpCn0KIyBSdW4gZDFkMi5meCBmb3IgQlNyZiwgR1JyZgpzb2MuMjAwMS5scy5pbmMgPC0gc29jLjIwMDEubHMgCnNvYy4yMDAxLmxzLmluYyRHUnJmIDwtIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoc29jLjIwMDEubHMkR1JyZiwgc29jLjIwMDEubHMkR1JyZiRwcm9fcmVwKSwgZDFkMi5meCkpCnNvYy4yMDAxLmxzLmluYyRCU3JmIDwtIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoc29jLjIwMDEubHMkQlNyZiwgc29jLjIwMDEubHMkQlNyZiRwcm9fcmVwKSwgZDFkMi5meCkpCgojIGNhbGN1bGF0ZSBTT0Mgc3RvY2tzCnNvYy4yMDAxLmxzIDwtIGxhcHBseShzb2MuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jX2tnbTIgPC0gZGYkQy4gKiBkZiRiZC5nLmNtMyAqIChkZiRseXJfYm90IC0gZGYkbHlyX3RvcCkgKiAxMF4tMQogIHJldHVybihkZikKfSkKCiMgc3VtbWFyaXplIFtub3RlIHRoYXQgc29jIHN0b2NrcyBhcmUgZHJvcHBlZF0Kc29jLjIwMDEuc3VtIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShzb2MuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIG11dGF0ZShJRDIgPSBwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KSkgJT4lCiAgICBncm91cF9ieShJRDIsIGJkLmcuY20zLCBQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUoY19wY3RfYXZnID0gbWVhbihDLikpCn0pKSkKCiMgMjAxOSBkYXRhCnNyYS4yMDE5LmNuLnN1bSA8LSBkYXRhLmZyYW1lKAogIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlKFBNZWNvID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDIpLAogICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChJRCwgIl8iKSwgIlsiLCA0KSkgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIGRlcHRoKSAlPiUKICBzdW1tYXJpemUoY19wY3RfYXZnID0gbWVhbihDKSkpCnNyYS4yMDE5LmNuLnN1bSRJRDIgPC0gcGFzdGUoc3JhLjIwMTkuY24uc3VtJFBNZWNvLCBzcmEuMjAxOS5jbi5zdW0kZGVwdGgsIHNlcCA9ICJfIikKYGBgCgpgYGB7ciByZWFkLXJlc3AtdHN9CiMjIHJlYWQgaW4gdGltZXNlcmllcyBvZiBDTzIgcmVsZWFzZSBmcm9tIGluY3ViYXRpb25zCiMgMjAxOQpzcmEuMTlhLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWFfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQpzcmEuMTliLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWJfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQoKIyAyMDAxCnNyYS4wMS4xLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MwMV8xX0NPMl9mbHV4XzIwMjEtMDEtMjcuY3N2IikKc3JhLjAxLjIuY28yLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvbGFiX2plbmFfQ08yLXRpbWVzZXJpZXMvUzAxXzJfQ08yX2ZsdXhfMjAyMS0wMS0yNy5jc3YiKQoKIyMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJQTWVjbyIsICJJRCIsICJkd19nIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAibWdDTzJfamFyIikKaW52aXNpYmxlKGxhcHBseShsaXN0KHNyYS4xOWEuY28yLnRzLAogICAgICAgICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMi5jbzIudHMpLAogICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICBpZmVsc2UoIWlzLm5hKG1hdGNoKG5tcywgbmFtZXMoeCkpKSwgInllcyIsICJubyIpCiAgICAgICB9CiAgICAgICApKQoKIyBjb21iaW5lIGFsbCBkYXRhLCByZW1vdmUgdGltZSBwb2ludHMgd2l0aG91dCBDTzIgbWVhc3VyZW1lbnRzLCBhbmQgYWRkIHllYXIgYW5kIHJlcCAKdHMgPC0gYmluZF9yb3dzKHNyYS4xOWEuY28yLnRzWyAsIG5tc10sIAogICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHNbICwgbm1zXSwgCiAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHNbICwgbm1zXSwKICAgICAgICAgICAgICAgIHNyYS4wMS4yLmNvMi50c1sgLCBubXNdKQppZihsZW5ndGgod2hpY2goaXMubmEodHMkbWdDTzJfamFyKSkpID4gMCkgewogIHRzIDwtIHRzWy13aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSwgXQp9CnRzJHllYXIgPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDMpCnRzJHJlcCA8LSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRzJElEKSwgIl8iKSwgIltbIiwgNCkKdHMkZGVwdGggPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDIpCnRzJElEMiA8LSBwYXN0ZSh0cyRQTWVjbywgdHMkZGVwdGgsIHNlcCA9ICJfIikKCiMgYWRkIEMgY29udGVudAp0c1t3aGljaCh0cyR5ZWFyID09IDIwMDEpLCAiZ0NfZ1MiXSA8LSBzb2MuMjAwMS5zdW1bbWF0Y2godHNbd2hpY2godHMkeWVhciA9PSAyMDAxKSwgIklEMiJdLCBzb2MuMjAwMS5zdW0kSUQyKSwgImNfcGN0X2F2ZyJdICogMTBeLTIKdHNbd2hpY2godHMkeWVhciA9PSAyMDE5KSwgImdDX2dTIl0gPC0gc3JhLjIwMTkuY24uc3VtW21hdGNoKHRzW3doaWNoKHRzJHllYXIgPT0gMjAxOSksICJJRDIiXSwgc3JhLjIwMTkuY24uc3VtJElEMiksICJjX3BjdF9hdmciXSAqIDEwXi0yCgojIGNhbGN1bGF0ZSBwZXIgdW5pdCBjYXJib24gZmx1eGVzCnRzJG1nQ08yX2dDIDwtIHRzJGdDX2dTICogdHMkZHdfZyAqIHRzJG1nQ08yX2phciAqICgxMi80NCkKdHMkbWdDTzJfZ0NfZCA8LSB0cyRtZ0NPMl9nQyAvIHRzJHRpbWVfZAoKIyBhdmVyYWdlIHJlcHMKdHMuYXZnIDwtIHRzICU+JQogIGdyb3VwX2J5KFBNZWNvLCB5ZWFyLCBkZXB0aCwgdGltZXBvaW50X2NtdHYpICU+JQogIHN1bW1hcml6ZSh0aW1lX2QgPSBtZWFuKHRpbWVfZCksCiAgICAgICAgICAgIG1nQ08yX2dDX2RfYXZnID0gbWVhbihtZ0NPMl9nQ19kKSwKICAgICAgICAgICAgbWdDTzJfZ0NfZF9tYXggPSBtYXgobWdDTzJfZ0NfZCksCiAgICAgICAgICAgIG1nQ08yX2dDX2RfbWluID0gbWluKG1nQ08yX2dDX2QpLAogICAgICAgICAgICBtZ0NPMl9nQ19hdmcgPSBtZWFuKG1nQ08yX2dDKSwKICAgICAgICAgICAgbWdDTzJfZ0NfbWF4ID0gbWF4KG1nQ08yX2dDKSwKICAgICAgICAgICAgbWdDTzJfZ0NfbWluID0gbWluKG1nQ08yX2dDKSkgJT4lCiAgbXV0YXRlKFBNZWNvX2RlcHRoX3llYXIgPSBwYXN0ZShQTWVjbywgZGVwdGgsIHllYXIsIHNlcCA9ICJfIikpCgojIGFkZCBkZXB0aCBpbmRleAp0MSA8LSB0cy5hdmdbdHMuYXZnJHRpbWVwb2ludF9jbXR2ID09IDEsIF0KdDEgPC0gZGF0YS5mcmFtZSgKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3BsaXQodDEsIHQxJHllYXIpLCBmdW5jdGlvbihkZikgewogICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGRmLCBkZiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICAgICAgICB4JGx5cl90b3AgPC0gYXMubnVtZXJpYyhzYXBwbHkoc3Ryc3BsaXQoeCRkZXB0aCwgIi0iKSwgIlsiLCAxKSkKICAgICAgICB4IDwtIHhbb3JkZXIoeCRseXJfdG9wKSwgXQogICAgICAgIHgkZGVwdGhfaW5kZXggPC0gc2VxKDEsIG5yb3coeCkpCiAgICAgICAgcmV0dXJuKHgpCiAgICAgIH0pKQogICAgfSkpKQp0cy5hdmckZGVwdGhfaW5kZXggPC0gdDFbbWF0Y2godHMuYXZnJFBNZWNvX2RlcHRoX3llYXIsIHQxJFBNZWNvX2RlcHRoX3llYXIpLCAiZGVwdGhfaW5kZXgiXQpgYGAKCmBgYHtyIHBsb3QtcmVzcC1yYXRlc30KZmlnLm4gPC0gMQojIGZ1bmN0aW9uIGZvciBwbG90dGluZwp0cy5wbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCB5ciwgaW5jcmVtZW50LCBjdW11bGF0aXZlID0gVFJVRSkgewogICAgICBpZiAoY3VtdWxhdGl2ZSkgewogICAgICAgIGRmICU+JQogICAgICAgICAgZmlsdGVyKHllYXIgPT0geXIgJiBkZXB0aF9pbmRleCA9PSBpbmNyZW1lbnQpICU+JQogICAgICAgICAgbXV0YXRlKFBNID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvKSwgIkFOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY28pLCAiQlMiLCAiR1IiKSksCiAgICAgICAgICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShncmVwbCgicmYiLCBQTWVjbyksICJyZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvKSwgIndmIiwgInBwIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgICAgICAgICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZCwgbWdDTzJfZ0NfYXZnLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICAgICAgICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWdDTzJfZ0NfbWF4LCB5bWF4ID0gbWdDTzJfZ0NfbWluLCBmaWxsID0gUE0sIGxpbmV0eXBlID0gZWNvLCBhbHBoYSA9IDAuMiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfbWF4LCBmaWxsID0gUE0sIHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywgc3Ryb2tlID0gMSkgKwogICAgICAgICAgZ2VvbV9wb2ludChhZXModGltZV9kLCBtZ0NPMl9nQ19taW4sIGZpbGwgPSBQTSwgc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLCBzdHJva2UgPSAxKSArCiAgICAgICAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gUE0sIGxpbmV0eXBlID0gZWNvKSwgc2l6ZSA9IDEuMikgKwogICAgICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLAogICAgICAgICAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKGVjbyA9IGMoInJmIiA9ICJjb2xkIiwgIndmIiA9ICJjb29sIiwgInBwIiA9ICJ3YXJtIikpKSArCiAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDMwKSkgKwogICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInJmIiA9ICJjb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gIndhcm0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAyMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDI0KSkgKwogICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jKCJBTiIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgICAgICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicmYiID0gImRvdHRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gInNvbGlkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcCIgPSAid2FybSIpKSArCiAgICAgICAgICB5bGFiKGV4cHJlc3Npb24oJ0N1bXVsYXRpdmUgZmx1eCAobWdDTydbMl0qJy1DIGdDJ14tMSonKScpKSArCiAgICAgICAgICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICAgICAgICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLAogICAgICAgICAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMykpICsKICAgICAgICAgIGdndGl0bGUocGFzdGUoIkN1bXVsYXRpdmUgZmx1eCwgIiwgeXIsICJkZXB0aCAiLCBpbmNyZW1lbnQpKSArCiAgICAgICAgICB0aGVtZV9idygpICsKICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiAgICB9IGVsc2UgewogICAgICAgZGYgJT4lCiAgICAgICAgZmlsdGVyKHllYXIgPT0geXIgJiBkZXB0aF9pbmRleCA9PSBpbmNyZW1lbnQpICU+JQogICAgICAgIG11dGF0ZShQTSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJBTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjbyksICJCUyIsICJHUiIpKSwKICAgICAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCJyZiIsIFBNZWNvKSwgInJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjbyksICJ3ZiIsICJwcCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogICAgICAgIGdncGxvdCguLCBhZXModGltZV9kLCBtZ0NPMl9nQ19kX2F2ZywgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgICAgICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZ0NPMl9nQ19kX21heCwgeW1heCA9IG1nQ08yX2dDX2RfbWluLCBmaWxsID0gUE0sIGxpbmV0eXBlID0gZWNvLCBhbHBoYSA9IDAuMiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfZF9tYXgsIGZpbGwgPSBQTSwgc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLCBzdHJva2UgPSAxKSArCiAgICAgICAgICBnZW9tX3BvaW50KGFlcyh0aW1lX2QsIG1nQ08yX2dDX2RfbWluLCBmaWxsID0gUE0sIHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywgc3Ryb2tlID0gMSkgKwogICAgICAgIGdlb21fbGluZShhZXMoY29sb3IgPSBQTSwgbGluZXR5cGUgPSBlY28pLCBzaXplID0gMS4yKSArCiAgICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLAogICAgICAgICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihlY28gPSBjKCJyZiIgPSAiY29sZCIsICJ3ZiIgPSAiY29vbCIsICJwcCIgPSAid2FybSIpKSkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMzApKSArCiAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJ3YXJtIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDIxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAyNCkpICsKICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPWMoIkFOIiA9ICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicmYiID0gImRvdHRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcCIgPSAic29saWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJ3YXJtIikpICsKICAgICAgICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICAgICAgICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICAgICAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAxKSwKICAgICAgICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAzKSkgKwogICAgICAgIGdndGl0bGUocGFzdGUoIkZsdXggcmF0ZSIsIHlyLCAiZGVwdGggIiwgaW5jcmVtZW50KSkgKwogICAgICAgIHRoZW1lX2J3KCkgKwogICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiAgICB9Cn0KCiMjIGN1bXVsYXRpdmUgZmx1eAojIDIwMTkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMTkiLCBpbmNyZW1lbnQgPSAiMSIpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjIiKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIzIikKIyAyMDAxCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDAxIiwgaW5jcmVtZW50ID0gIjEiKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIyIikKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMyIpCgojIyBmbHV4IHJhdGVzCiMgMjAxOQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIxIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIyIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIzIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQojIDIwMDEKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMSIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMiIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMyIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFJlc3BpcmF0aW9uIGRhdGEgZnJvbSBpbmN1YmF0aW9ucyBvZiAyMDE5IGFuZCAyMDAxIGJ1bGsgc29pbHMuICoqCgo+KkNhcHRpb246KiBQb2ludHMgc2hvdyBtZWFzdXJlZCBDT34yfiBwcm9kdWN0aW9uIG9mIGxhYm9yYXRvcnkgZHVwbGljYXRlcyBhcyBjdW11bGF0aXZlIGZsdXhlcyBvciBkYWlseSBmbHV4IHJhdGVzIGJ5IGRlcHRoLCBsaW5lcyBzaG93IHRoZSBtZWFucywgYW5kIHRoZSByaWJib24gcmVwcmVzZW50cyB0aGUgcmFuZ2UuIAoKKk1lcmdlIHRlbXBsYXRlcyB3aXRoIDE0QywgQywgYW5kIE4gZGF0YSoKClJhZGlvY2FyYm9uIGFuYWx5c2VzIGZvciB0aGUgMjAwMSBzYW1wbGVzIHdlcmUgbm90IHJ1biBvcmlnaW5hbGx5LCBidXQgd2VyZSBjb21wbGV0ZWQgb24gYXJjaGl2ZWQgc2FtcGxlcyBpbiAyMDIwLgoKYGBge3IgbWVyZ2UtaXNvLWRhdGEtUzAxLXNvaWx9CiMgRXh0cmFjdCAxNEMgZGF0YSBmb3IgMjAwMSBzYW1wbGVzCmFtc19yZXN1bHRzX2xzX1MwMSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJTMDEiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMDEpKSB7CiAgc3JhLjIwMDFbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfUzAxLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMDEpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDAxKVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMDFbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMDFbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDAxIDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMDEsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMgY3JlYXRlIElEIGZpZWxkLCB0cmltIGRmLCBhbmQgYWRkIGRlcHRocwpzcmEuMjAwMSRJRCA8LSB1bmxpc3Qoc3Ryc3BsaXQoc3JhLjIwMDEkUHJvYmUsICJfU2llcnJhIE5ldmFkYV8yMDAxIikpCnNyYS4yMDAxIDwtIHNyYS4yMDAxWyAsIGMoIklEIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMDEpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKc3JhLjIwMDEkbHlyX3RvcCA8LSBhcy5udW1lcmljKGlmZWxzZShzdWJzdHIoc3JhLjIwMDEkSUQsIDksIDkpID09ICItIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDgsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgOCwgOSkpKQpzcmEuMjAwMSRseXJfYm90IDwtIGFzLm51bWVyaWMoaWZlbHNlKHN1YnN0cihzcmEuMjAwMSRJRCwgOSwgOSkgPT0gIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDEwLCBuY2hhcihzcmEuMjAwMSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgMTEsIG5jaGFyKHNyYS4yMDAxJElEKSkpKQpzcmEuMjAwMSRwcm9fcmVwIDwtIHN1YnN0cihzcmEuMjAwMSRJRCwgNiwgNikKc3JhLjIwMDEkUE0gPC0gZmFjdG9yKHN1YnN0cihzcmEuMjAwMSRJRCwgMSwgMikpCnNyYS4yMDAxJEVDTyA8LSBmYWN0b3Ioc3Vic3RyKHNyYS4yMDAxJElELCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkKc3JhLjIwMDEkcHJvX25hbWUgPC0gc3Vic3RyKHNyYS4yMDAxJElELCAxLCA2KQpzcmEuMjAwMSRQTWVjbyA8LSBzdWJzdHIoc3JhLjIwMDEkSUQsIDEsIDQpCgojIHJlbW92ZSBvdXRsaWVyIEFOcHAgc2FtcGxlCnNyYS4yMDAxIDwtIHNyYS4yMDAxWy13aGljaChzcmEuMjAwMSRJRCA9PSAiQU5wcF8zXzYtMTMiKSwgXQoKIyBtYWtlIGxpc3QgYnkgUE1lY28Kc3JhLjIwMDEubHMgPC0gc3BsaXQoc3JhLjIwMDEsIHNyYS4yMDAxJFBNZWNvKQpgYGAKCmBgYHtyIG1lcmdlLWlzby1kYXRhLXNvaWwtUzE5fQojIEV4dHJhY3QgMTRDIGRhdGEgZm9yIDIwMTkgc2FtcGxlcwphbXNfcmVzdWx0c19sc19TMTkgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgic29pbC1TMTkiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkpKSB7CiAgc3JhLjIwMTlbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfUzE5LCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMTkpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDE5KVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMTlbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMTlbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5IDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMTksIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMjIG1lcmdlIHcvIDIwMTkgdGVtcGxhdGUKIyByZW5hbWUgY29scyBpbiBBTVMgdGFibGVzCnNyYS4yMDE5IDwtIHNyYS4yMDE5WyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKIyBtZXJnZQpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuZGYsIHNyYS4yMDE5LmRmJGx5cl9uYW1lKSwgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMTlbZ3JlcChkZiRseXJfbmFtZSwgc3JhLjIwMTkkSUQpLCBdKQogIGRmJElEIDwtIE5VTEwKICBkZiRQTWVjbyA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTykKICByZXR1cm4oZGYpCn0pCgojIHJlc2hhcGUgbGlzdCBieSBQTWVjbwpzcmEuMjAxOS5scyA8LSBzcGxpdChiaW5kX3Jvd3Moc3JhLjIwMTkubHMpLCBiaW5kX3Jvd3Moc3JhLjIwMTkubHMpW1siUE1lY28iXV0pCmBgYAoKYGBge3IgbWVyZ2UtaXNvLWRhdGEtY28yfQojIyMgRXh0cmFjdCAxNEMgZGF0YSBmb3IgaW5jdWJhdGlvbiBzYW1wbGVzCiMjIHJlc3BpcmVkIENPMiwgc29pbAojIDIwMTkKYW1zX3Jlc3VsdHNfbHNfY28yX1MxOSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJjbzItUzE5IiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KZm9yIChpIGluIHNlcV9hbG9uZyhzcmEuMjAxOS5pbmMpKSB7CiAgc3JhLjIwMTkuaW5jW1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX2NvMl9TMTksIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGlmIChhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMTkuaW5jKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgIGRmW2dyZXAobmFtZXMoc3JhLjIwMTkuaW5jKVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMTkuaW5jW1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDE5LmluY1tbaV1dLCByZWN1cnNpdmUgPSBGQUxTRSkpCn0Kc3JhLjIwMTkuaW5jIDwtIHR5cGUuY29udmVydCgKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkodW5saXN0KHNyYS4yMDE5LmluYywgcmVjdXJzaXZlID0gRkFMU0UpLCAKICAgICAgICAgICBmdW5jdGlvbih4KSB4ICU+JSBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikpKSwKICBhcy5pcyA9IFRSVUUpCnNyYS4yMDE5LmluYyA8LSBzcmEuMjAxOS5pbmNbLXdoaWNoKGlzLm5hKHNyYS4yMDE5LmluYyRGMTRDKSksIF0KCiMgMjAwMQphbXNfcmVzdWx0c19sc19jbzJfUzAxIDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoImNvMi1TMDEiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQojIHJlbW92ZSBxdWVzdGlvbmFibGUvZHVwbGljYXRlIHNhbXBsZXMKIyBBTnJmX2NvbXBfMTEtMzJfMjAwMV9hIChhbmFseXplZCB0d2ljZTsgYm90aCBhbm9tb3VzbHkgbG93IGNvbXBhcmVkIHRvIHJlcCBhbmQgcmVzdCBvZiBkYXRhKQphbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xMWAkYEJlZW0tTWlsbGVyXzIyLnhsc3hgIDwtIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIwLTEyLTExYCRgQmVlbS1NaWxsZXJfMjIueGxzeGBbLWdyZXAoIkFOcmZfY29tcF8xMS0zMl8yMDAxX2EiLCBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xMWAkYEJlZW0tTWlsbGVyXzIyLnhsc3hgJFByb2JlKSwgXQphbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfM19yZXN1bHRzLnhsc3hgIDwtIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIwLTEyLTE2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8zX3Jlc3VsdHMueGxzeGBbLWdyZXAoIkFOcmZfY29tcF8xMS0zMl8yMDAxX2EiLCBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfM19yZXN1bHRzLnhsc3hgJFByb2JlKSwgXQojIGZyb20gb3JpZ2luYWwgYW5hbHlzaXMgb2Ygc2FtcGxlcyBleHRyYWN0ZWQgb25saW5lIDExLURlYy0yMDIwIChzZWUgcmVhZG1lIGZvciBub3RlcykKYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMy54bHN4YCA8LSBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xMWAkYEJlZW0tTWlsbGVyXzIzLnhsc3hgWy1ncmVwKCJHUndmX2NvbXBfMTMtMjhfMjAwMV9hXzExIiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjEtMDEtMjZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzJfcmVzdWx0cy54bHN4YCRQcm9iZSksIF0KIyBmcm9tIHJlYW5hbHlzaXMgb2Ygc2FtcGxlcyBleHRyYWN0ZWQgb25saW5lIDExLURlYy0yMDIwIChzZWUgcmVhZG1lIGZvciBub3RlcykKIyBHUnJmX2NvbXBfOC0yN18yMDAxX2FfNSwgR1JyZl9jb21wXzgtMjdfMjAwMV9iXzYsIEdScHBfY29tcF8xNS0yN18yMDAxX2JfMTggCmFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAgPC0gYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjEtMDEtMjZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzJfcmVzdWx0cy54bHN4YFtjKAogIGdyZXAoIkdScmZfY29tcF84LTI3XzIwMDFfYV81IiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjEtMDEtMjZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzJfcmVzdWx0cy54bHN4YCRQcm9iZSksCiAgZ3JlcCgiR1J3Zl9jb21wXzEzLTI4XzIwMDFfYl8xMiIsIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAkUHJvYmUpKSwgXQoKIyBjcmVhdGUgdGVtcGxhdGUgZm9yIGV4dHJhY3RpbmcgZGF0YQpzcmEuMjAwMS5pbmMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aCh1bmlxdWUoc3JhLjIwMTkuaW5jLmRmJHByb19uYW1lKSkpCm5hbWVzKHNyYS4yMDAxLmluYykgPC0gdW5pcXVlKHNyYS4yMDE5LmluYy5kZiRwcm9fbmFtZSkKIyBtZXJnZSB3aXRoIDE0QyBkYXRhCmZvciAoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMDEuaW5jKSkgewogIHNyYS4yMDAxLmluY1tbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19jbzJfUzAxLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZiAoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDAxLmluYylbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDAxLmluYylbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDAxLmluY1tbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAwMS5pbmNbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDAxLmluYyA8LSB0eXBlLmNvbnZlcnQoCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHVubGlzdChzcmEuMjAwMS5pbmMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgCiAgICAgICAgICAgZnVuY3Rpb24oeCkgeCAlPiUgbXV0YXRlX2FsbChhcy5jaGFyYWN0ZXIpKSksCiAgYXMuaXMgPSBUUlVFKQpzcmEuMjAwMS5pbmMgPC0gc3JhLjIwMDEuaW5jWy13aGljaChpcy5uYShzcmEuMjAwMS5pbmMkRjE0QykpLCBdCgojIHJlc3BpcmVkIENPMiwgbGl0dGVyCmFtc19yZXN1bHRzX2xzX2NvMl9MMTkgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgiY28yLUwxOSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvcihpIGluIHNlcV9hbG9uZyhzcmEuMjAxOS5pbmNfTCkpIHsKICBzcmEuMjAxOS5pbmNfTFtbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19jbzJfTDE5LCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMTkuaW5jX0wpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDE5LmluY19MKVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMTkuaW5jX0xbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMTkuaW5jX0xbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5LmluY19MIDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMTkuaW5jX0wsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMjIG1lcmdlIHcvIHRlbXBsYXRlcyBbd2h5IGRvIEkgZG8gdGhpcyB0d2ljZT9dCiMgcmVuYW1lIGNvbHMgaW4gQU1TIHRhYmxlcwojIHNvaWwgQ08yCnNyYS4yMDE5LmluYyA8LSBzcmEuMjAxOS5pbmNbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAxOS5pbmMpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKc3JhLjIwMDEuaW5jIDwtIHNyYS4yMDAxLmluY1sgLCBjKCJQcm9iZSIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDAxLmluYykgPC0gYygiSUQiLCAiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiKQojIG1lcmdlCiMgMjAxOQpzcmEuMjAxOS5pbmMubHMgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMjAxOS5pbmMuZGYsIHNyYS4yMDE5LmluYy5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMTkuaW5jW2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDE5LmluYyRJRCksIF0pCiAgICBkZiRJRCA8LSBOVUxMCiAgICBkZiRQTWVjbyA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTykKICAgIHJldHVybihkZikKICB9KQopCnNyYS4yMDE5LmluYy5scyA8LSBzcGxpdChzcmEuMjAxOS5pbmMubHMsIHNyYS4yMDE5LmluYy5scyRQTWVjbykKIyAyMDAxCnNyYS4yMDAxLmluYy5scyA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmluYy5kZiwgc3JhLjIwMDEuaW5jLmRmJGx5cl9uYW1lKSwgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIG1lcmdlKGRmLCBzcmEuMjAwMS5pbmNbZ3JlcChkZiRseXJfbmFtZSwgc3JhLjIwMDEuaW5jJElEKSwgXSkKICAgIGRmJElEIDwtIE5VTEwKICAgIGRmJFBNZWNvIDwtIHBhc3RlMChkZiRQTSwgZGYkRUNPKQogICAgcmV0dXJuKGRmKQogIH0pCikKc3JhLjIwMDEuaW5jLmxzIDwtIHNwbGl0KHNyYS4yMDAxLmluYy5scywgc3JhLjIwMDEuaW5jLmxzJFBNZWNvKQoKCiMgbGl0dGVyIENPMgpzcmEuMjAxOS5pbmNfTCA8LSBzcmEuMjAxOS5pbmNfTFsgLCBjKCJQcm9iZSIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDE5LmluY19MKSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCnNyYS4yMDE5LmluY19MJElEIDwtIHN1YnN0cihzdWJzdHJpbmcoc3JhLjIwMTkuaW5jX0wkSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cHIoIl8iLCBzcmEuMjAxOS5pbmNfTCRJRCkgKyAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2hhcihzcmEuMjAxOS5pbmNfTCRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgOCkKc3JhLjIwMTkuaW5jLmRmX0wgPC0gZGF0YS5mcmFtZShZZWFyID0gcmVwKDIwMTksIDE4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAgPSByZXAoYygxLCAyKSwgOSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE0gPSByZXAoYygiQU4iLCAiQlMiLCAiR1IiKSwgZWFjaCA9IDYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjbyA9IHJlcChjKCJwcCIsICJ3ZiIsICJyZiIpLCBlYWNoID0gMiwgdGltZXMgPSAzKSkKc3JhLjIwMTkuaW5jLmRmX0wkUE1lY28gPC0gcGFzdGUwKHNyYS4yMDE5LmluYy5kZl9MJFBNLCBzcmEuMjAxOS5pbmMuZGZfTCRlY28pCnNyYS4yMDE5LmluYy5kZl9MJElEIDwtIHBhc3RlMChzcmEuMjAxOS5pbmMuZGZfTCRQTSwgc3JhLjIwMTkuaW5jLmRmX0wkZWNvLCAiLUxfIiwgc3JhLjIwMTkuaW5jLmRmX0wkcmVwKQojIGFkZCBkcnkgd3RzIGFuZCBsaXR0ZXIgZGVwdGgKc3JhLjIwMTkuTCA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX2xpdHRlci9MaXR0ZXJfMjAxOV8yMDIxLTAxLTI3LmNzdiIpCnNyYS4yMDE5LmluYy5kZl9MIDwtIG1lcmdlKHNyYS4yMDE5LmluYy5kZl9MLCBzcmEuMjAxOS5MWyAsIGMoIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIpXSwgYWxsLnggPSBUUlVFKQojIG1lcmdlCnNyYS4yMDE5LmluY19MLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jX0wsIHNyYS4yMDE5LmluY19MJElEKSwgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIG1lcmdlKGRmLCBzcmEuMjAxOS5pbmMuZGZfTCwgYnkgPSAiSUQiKQogICAgZGYkSUQgPC0gTlVMTAogICAgcmV0dXJuKGRmKQogIH0pCikKc3JhLjIwMTkuaW5jX0wubHMgPC0gc3BsaXQoc3JhLjIwMTkuaW5jX0wuZGYsIHNyYS4yMDE5LmluY19MLmRmJFBNZWNvKQpgYGAKCmBgYHtyIHBsb3QtdXRpbHN9CiMgZm0gYW5kIGQxNGMgY29udmVyc2lvbiBmdW5jdGlvbnMKbGFtYmRhIDwtIDEvODI2NyAjID0gMS8odHJ1ZSBtZWFuIGxpZmUgb2YgMTRDKQpjYWxjX2ZtIDwtIGZ1bmN0aW9uKGQxNGMsIG9ic19kYXRlX3kpIHsKICAoKGQxNGMvMTAwMCkgKyAxKS9leHAobGFtYmRhICogKDE5NTAgLSBvYnNfZGF0ZV95KSkKfQpjYWxjXzE0YyA8LSBmdW5jdGlvbihmbSwgb2JzX2RhdGVfeSkgewogIChmbSAqIGV4cChsYW1iZGEgKiAoMTk1MCAtIG9ic19kYXRlX3kpKSAtIDEpICogMTAwMAp9CgojIGNhbGMgYXRtIGluIDIwMDEsIDIwMDksIDIwMTkKRGF0bSA8LSByYmluZChncmF2ZW4sIGZ1dHVyZTE0QykKYXRtLmQxNC4yMDAxIDwtIERhdG1bRGF0bSREYXRlID09IDIwMDEuNSwgIk5IYzE0Il0KYXRtLmZtLjIwMDEgPC0gY2FsY19mbShhdG0uZDE0LjIwMDEsIDIwMDEpCmF0bS5kMTQuMjAwOSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDA5LjUsICJOSGMxNCJdCmF0bS5mbS4yMDA5IDwtIGNhbGNfZm0oYXRtLmQxNC4yMDA5LCAyMDA5KQphdG0uZDE0LjIwMTkgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAxOS41LCAiTkhjMTQiXQphdG0uZm0uMjAxOSA8LSBjYWxjX2ZtKGF0bS5kMTQuMjAxOSwgMjAxOSkKYGBgCgpgYGB7ciBwbG90LWxpdHRlci0xNGN9CmZpZy5uIDwtIGZpZy5uICsgMQojIHN1bW1hcml6ZSBsaXR0ZXIgaW5jIGRhdGEKc3JhLjIwMTkuaW5jX0wuc3VtIDwtIHNyYS4yMDE5LmluY19MLmRmICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKGVjbyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVjbyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gZmFjdG9yKGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSwKICAgICAgICAgWWVhciA9IGZhY3RvcigiMjAxOSIpKSAlPiUKICBncm91cF9ieShZZWFyLCBwbSwgZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICBzdW1tYXJpemUoZDE0Y19tZWFuID0gbWVhbihkMTRjKSwKICAgICAgICAgICAgZDE0Y191ID0gbWF4KGQxNGMpLAogICAgICAgICAgICBkMTRjX2wgPSBtaW4oZDE0YykpCgojIHBsb3QgYXMgY29scyBieSBjbGltYXRlCnNyYS4yMDE5LmluY19MLnN1bSAlPiUKICBtdXRhdGUoTUFUID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSwgbGFiZWxzID0gYygiMTAtMTMiLCAiOC0xMCIsICI1LTYiKSkpICU+JQogIGdncGxvdCguLCBhZXMoTUFULCBkMTRjX21lYW4sIGZpbGwgPSBwbSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UyIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSBkMTRjX3UsIHltaW4gPSBkMTRjX2wsIGNvbG9yID0gcG0pLCAKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjUsIHBhZGRpbmcgPSAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgY29vcmRfZmxpcCgpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbigiTUFUICgiKn5kZWdyZWUqQyoiKSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBhcyBwb2ludHMgd2l0aCBkZXB0aApzcmEuMjAxOS5pbmNfTC5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl90b3AsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtYXggPSBkMTRjX3UsIHhtaW4gPSBkMTRjX2wpLCBoZWlnaHQgPSAxKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbykpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIExpdHRlciBpbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMtQ09+Mn4gKDIwMTkpKioKCj4qQ2FwdGlvbjoqIE1lYW4gJFxEZWx0YSReMTReQy1DT34yfiBmb3IgZWFjaCBzaXRlLiBFcnJvciBiYXJzIHNob3cgbWluIGFuZCBtYXggb2YgZHVwbGljYXRlIGluY3ViYXRpb24gc2FtcGxlcy4gXmEpXiBEYXRhIHNob3duIGJ5IHNpdGUsIHdpdGhvdXQgbGl0dGVyIGRlcHRoLCBeYileIERhdGEgc2hvd24gYnkgZGVwdGggb2YgbGl0dGVyIGxheWVyLCBiaW5uZWQgYnkgY2xpbWF0ZSB6b25lLgoKYGBge3IgcGxvdC0xNGMtcHJvZmlsZS1meH0KcHJvLnBsb3QgPC0gZnVuY3Rpb24oZGYsIG1heERlcHRoLCBtaW4xNEMsIHJlcCkgewogIGdncGxvdChkZiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gUE0sIHNoYXBlID0gRUNPLCBncm91cCA9IHJlcCkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heERlcHRoLCAwKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluMTRDLCAxODApKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcCIgPSBleHByZXNzaW9uKGl0YWxpYygiUC4gcG9uZGVyb3NhIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IGV4cHJlc3Npb24oaXRhbGljKCJBLiBtYWduaWZpY2EiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gZXhwcmVzc2lvbihpdGFsaWMoIkEuIGNvbmNvbG9yIikpKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDE3KSkgKwogICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KYGBgCgpgYGB7ciBwbG90LTIwMDEtcHJvZmlsZXN9CiMgbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgcHJvLnBsb3QoZGYsIG1heChkZiRseXJfYm90KSwgbWluKGRmJGQxNGMpLCBkZiRwcm9fcmVwKSkKYGBgCgpgYGB7ciBwbG90LTIwMTktcHJvZmlsZXN9CiMgbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgcHJvLnBsb3QoZGYsIG1heChkZiRseXJfYm90KSwgbWluKGRmJGQxNGMpLCBkZiRwcm9fcmVwKSkKYGBgCgpgYGB7ciBwbG90LTIwMTktY28yLXByb2ZpbGVzfQojIGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIE5BKSkKYGBgCgojIyAyMDAxIG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDAxLWF2Zy1wcm9maWxlc30KIyBjb21iaW5lIHJlcHMKc3JhLjIwMDEuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGx5cl9ib3QgPD0gNDApICU+JQogICAgICAgICAgICAgICAgICAgICBtdXRhdGUobHlyX3RvcF9jaCA9IGFzLmNoYXJhY3RlcihseXJfdG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3RfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX2JvdCkpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoUE0sIEVDTywgUE1lY28sIGZtLCBkMTRjLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE0sIEVDTywgUE1lY28sIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpKQogIG5hbWVzKGRmKSA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImQxNGMiLCAiZm1fc2QiLCAiZDE0Y19zZCIpCiAgZGYkbHlyX3RvcCA8LSBhcy5udW1lcmljKGRmJGx5cl90b3ApCiAgZGYkbHlyX2JvdCA8LSBhcy5udW1lcmljKGRmJGx5cl9ib3QpCiAgZGYkZDE0Y191IDwtIGRmJGQxNGMgKyBkZiRkMTRjX3NkCiAgZGYkZDE0Y19sIDwtIGRmJGQxNGMgLSBkZiRkMTRjX3NkCiAgcmV0dXJuKGRmW29yZGVyKGRmJGx5cl9ib3QpLCBdKQp9KQpzcmEuMDEuc3VtIDwtIGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgcGxvdApmaWcubiA8LSBmaWcubiArIDEKc3JhLjAxLnN1bSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IFBNZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMCwgMTgwKSkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBNZWFuIHByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAwMSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIE1lYW4gJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMDEuIEVycm9yIGJhcnMgc2hvdyDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uLCBzb2xpZCB2ZXJ0aWNhbCBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUgaW4gdGhlIHllYXIgb2Ygc2FtcGxpbmcuCgojIyAyMDA5IHJhZGlvY2FyYm9uIHByb2ZpbGVzCmBgYHtyIHBsb3QtMjAwOS1wcm9maWxlc30KIyAyMDA5IGRhdGEgKGZyb20gQy4gUmFzbXVzc2VuKQpyYXMxOC5seXIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9qZWZmL1IvMTRDb25zdHJhaW50L3Jhc18yMDE4LmNzdiIpCnJhczE4Lmx5ciRFQ08gPC0gZmFjdG9yKHJhczE4Lmx5ciRNQVNULCBsYWJlbHMgPSBjKCJyZiIsIndmIiwicHAiKSkKIyBhZGQgUE1lY28gY29sCnJhczE4Lmx5ciRFQ08gPC0gZmFjdG9yKHJhczE4Lmx5ciRNQVNULCBsYWJlbHMgPSBjKCJyZiIsIndmIiwicHAiKSkKcmFzMTgubHlyJFBNZWNvIDwtIHBhc3RlMChyYXMxOC5seXIkUE0sIHJhczE4Lmx5ciRFQ08pCgojIHN1bW1hcml6ZSAwOSBkYXRhCnNyYS4wOS5zdW0gPC0gcmFzMTgubHlyICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDkuc3VtICU+JQogIGdncGxvdCguLCBhZXMobHlyXzE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDA5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgobGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAwOSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIFByb2ZpbGUgJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMDkuIFNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4gRXJyb3IgYmFycyBub3Qgc2hvd24gYXMgb25seSBhIHNpbmdsZSByZXBsaWNhdGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgcGVyIHNpdGUuCgojIyAyMDE5IG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDE5LWF2Zy1wcm9maWxlc30KIyBjb21iaW5lIHJlcHMKc3JhLjIwMTkuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGx5cl90b3BfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX3RvcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBseXJfYm90X2NoID0gYXMuY2hhcmFjdGVyKGx5cl9ib3QpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFBNLCBFQ08sIFBNZWNvLCBmbSwgZDE0YywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNLCBFQ08sIFBNZWNvLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSkKICBuYW1lcyhkZikgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJmbSIsICJkMTRjIiwgImZtX3NkIiwgImQxNGNfc2QiKQogIGRmJGx5cl90b3AgPC0gYXMubnVtZXJpYyhkZiRseXJfdG9wKQogIGRmJGx5cl9ib3QgPC0gYXMubnVtZXJpYyhkZiRseXJfYm90KQogIGRmJGQxNGNfdSA8LSBkZiRkMTRjICsgZGYkZDE0Y19zZAogIGRmJGQxNGNfbCA8LSBkZiRkMTRjIC0gZGYkZDE0Y19zZAogIHJldHVybihkZikKfSkKc3JhLjE5LnN1bSA8LSBiaW5kX3Jvd3Moc3JhLjIwMTkuc3VtLmxzKSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpIAoKIyBwbG90CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuc3VtICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuNykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heChzcmEuMTkuc3VtJGx5cl9ib3QpLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKG1pbihzcmEuMTkuc3VtJGQxNGMpLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDE5IHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24sIHNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4KCiMjIENoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBiZXR3ZWVuIDIwMDEgYW5kIDIwMTkgCgpgYGB7ciBwbG90LWFsbC1hdmd9CiMgY29tYmluZSAnMDEgYW5kICcxOSBkYXRhIGZvciBwbG90dGluZwpzcmEuMDEuc3VtJFllYXIgPC0gMjAwMQpzcmEuMTkuc3VtJFllYXIgPC0gMjAxOQoKc3JhLmFsbCA8LSByYmluZChzcmEuMDEuc3VtLCBzcmEuMTkuc3VtKQpzcmEuYWxsJFllYXIgPC0gYXMuZmFjdG9yKHNyYS5hbGwkWWVhcikKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuYWxsICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChFQ08sIFllYXIpLAogICAgICAgICBlY29ZZWFyMiA9IGlmZWxzZShlY29ZZWFyID09ICJwcDIwMDEiLCAid2FybSAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicHAyMDE5IiwgIndhcm0gKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMDEiLCAiY29vbCAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMTkiLCAiY29vbCAoMjAxOSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicmYyMDAxIiwgImNvbGQgKDIwMDEpIiwgImNvbGQgKDIwMTkpIikpKSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhcjIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDAxKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMDEpIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKDIwMTkpIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxIGFuZCAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbi4gVmVydGljYWwgbGluZXMgc2hvdyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIDIwMDEgKHNvbGlkKSBhbmQgMjAxOSAoZGFzaGVkKS4KCiMjIEluY3ViYXRpb24gJFxEZWx0YSReMTReQy1DT34yfgoKYGBge3IgaW5jLWQxNGMtcGxvdC1zZXR1cH0KIyMgMjAxOQpzcmEuMjAxOS5pbmMuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmluYy5scykKIyBhZGQgbGl0dGVyIGluYyBkYXRhIGFuZCBzdW1tYXJpemUKc3JhLjIwMTkuaW5jLnN1bS5kZiA8LSBkYXRhLmZyYW1lKHJiaW5kKAogIHNyYS4yMDE5LmluY19MLnN1bVsgLCB3aGljaChuYW1lcyhzcmEuMjAxOS5pbmNfTC5zdW0pICE9ICJseXJfdG9wIildLAogIHNyYS4yMDE5LmluYy5kZiAlPiUKICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgcG0gPSBmYWN0b3IoaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICAgICMgcmVtb3ZlIEdScmYgMTAtMjAgImEiIHBvaW50CiAgICAgICAgICAgZDE0YyA9IHJlcGxhY2UoZDE0Yywgd2hpY2goZDE0YyA8IC0zMDApLCBOQSksCiAgICAgICAgICAgWWVhciA9IGZhY3RvcihZZWFyKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgcG0sIGVjbywgbHlyX2JvdCwgbHlyX3RvcCkgJT4lCiAgc3VtbWFyaXplKGQxNGNfbWVhbiA9IG1lYW4oZDE0YywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZDE0Y19sID0gbWluKGQxNGMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGQxNGNfdSA9IG1heChkMTRjLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgIHNlbGVjdCgtbHlyX3RvcCkpKQoKIyAyMDAxCnNyYS4yMDAxLmluYy5kZiA8LSBiaW5kX3Jvd3Moc3JhLjIwMDEuaW5jLmxzKQpzcmEuMjAwMS5pbmMuc3VtLmRmIDwtIGRhdGEuZnJhbWUoCiAgc3JhLjIwMDEuaW5jLmRmICU+JQogICAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgcG0gPSBmYWN0b3IoaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSksCiAgICAgICAgICAgWWVhciA9IGZhY3RvcihZZWFyKSkgJT4lCiAgICBncm91cF9ieShZZWFyLCBQTWVjbywgcG0sIGVjbywgbHlyX2JvdCwgbHlyX3RvcCkgJT4lCiAgICBzdW1tYXJpemUoZDE0Y19tZWFuID0gbWVhbihkMTRjKSwKICAgICAgICAgICAgICBkMTRjX2wgPSBtaW4oZDE0YyksCiAgICAgICAgICAgICAgZDE0Y191ID0gbWF4KGQxNGMpLAogICAgICAgICAgICAgIGZtX21lYW4gPSBtZWFuKGZtKSwKICAgICAgICAgICAgICBmbV9sID0gbWluKGZtKSwKICAgICAgICAgICAgICBmbV91ID0gbWF4KGZtKSkKKQpzcmEuMjAwMS5pbmMuc3VtLmxzIDwtIHNwbGl0KHNyYS4yMDAxLmluYy5zdW0uZGYsIHNyYS4yMDAxLmluYy5zdW0uZGYkUE1lY28pCnNyYS4yMDAxLmluYy5zdW0uZGYgPC0gc3JhLjIwMDEuaW5jLnN1bS5kZlsgLCAhKG5hbWVzKHNyYS4yMDAxLmluYy5zdW0uZGYpICVpbiUgYygiZm1fbWVhbiIsICJmbV9sIiwgImZtX3UiLCAibHlyX3RvcCIsICJQTWVjbyIpKV0KYGBgCgpgYGB7ciBwbG90LWluYy1kMTRjLTIwMTl9CiMgMjAxOQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjIwMTkuaW5jLnN1bS5kZltvcmRlcihzcmEuMjAxOS5pbmMuc3VtLmRmJGx5cl9ib3QpLCBdICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aChsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2YgMjAxOSBidWxrIHNvaWwgaW5jdWJhdGlvbnMqKgoKPipDYXB0aW9uOiogJFxEZWx0YSReMTReQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBPbmUgcmVwIGZyb20gR1JyZiAxMC0yMCAodGhlIDEwLTIwIGNtIGluY3JlbWVudCBzYW1wbGUgZnJvbSB0aGUgY29sZCBncmFuaXRlIHNpdGUpIGlzIHN0cm9uZ2x5IGRlcGxldGVkIHJlbGF0aXZlIHRvIHRoZSBvdGhlciByZXA6ICRcRGVsdGEkXjE0XkMtQ09+Mn4gPSBgciB7c3JhLjIwMTkuaW5jLmRmW3NyYS4yMDE5LmluYy5kZiRQTWVjbyA9PSAiR1JyZiIgJiBzcmEuMjAxOS5pbmMuZGYkbHlyX2JvdCA9PSAyMCwgImQxNGMiXX1gLiBUaGUgaGlnaGx5IGRlcGxldGVkIHNhbXBsZSBoYXMgYmVlbiBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zLgoKYGBge3IgcGxvdC1pbmMtZDE0Yy0yMDAxfQojIHBsb3QgMjAwMSBkYXRhCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMjAwMS5pbmMuc3VtLmRmICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gTm90ZSB0aGF0IHNvbWUgc2l0ZXMgb25seSBoYXZlIHR3byBkZXB0aCBpbmNyZW1lbnRzLiBTaW1pbGFyIHRvIHRoZSAyMDE5IGRhdGFzZXQsIG9uZSBvZiB0aGUgR1JyZiByZXBzIGZyb20gdGhlIGRlZXBlc3QgZGVwdGggaW5jcmVtZW50IHdhcyBzdHJvbmdseSBkZXBsZXRlZDogJFxEZWx0YSReMTReQy1DT34yfiA9IGByIHtzcmEuMjAwMS5pbmMuc3VtLmRmICU+JSBmaWx0ZXIocG0gPT0gImdyYW5pdGUiLCBlY28gPT0gImNvbGQiLCBseXJfYm90ID09IDI3KSAlPiUgcHVsbCgiZDE0Y19sIiwgImQxNGNfdSIpfWAuIEJvdGggcG9pbnRzIGhhdmUgYmVlbiBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zLgoKYGBge3IgcGxvdC1pbmMtZDE0Yy1hbGx9CiMgcGxvdCB0b2dldGhlcgpzcmEuaW5jLmFsbCA8LSByYmluZChzcmEuMjAwMS5pbmMuc3VtLmRmLCBzcmEuMjAxOS5pbmMuc3VtLmRmKQoKZmlnLm4gPC0gZmlnLm4gKyAxIApzcmEuaW5jLmFsbCAlPiUKICBmaWx0ZXIobHlyX2JvdCA+IDApICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKHBtLCBlY28sIFllYXIpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhcikpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MSwgMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYW5kIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMSBhbmQgMjAxOS4gRGlmZmVyZW50IGRlcHRoIGluY3JlbWVudHMgd2VyZSBzYW1wbGVkIGluIDIwMDEgYW5kIDIwMTkuIFBvaW50cyBhcmUgdGhlIG1lYW4gb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzOyBlcnJvciBiYXJzIGFyZSB0aGUgbWVhc3VyZWQgdmFsdWVzIG9mIGVhY2ggZHVwbGljYXRlLiBHcmFuaXRlL2NvbGQgcG9pbnQgZXhsY3VkZWQgZm9yIGRpc3BsYXkgcmVhc29ucyBhcyBpdCBpcyBzdHJvbmdseSBkZXBsZXRlZC4KCiMjIEluY3ViYXRpb24gdnMuIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DCgpgYGB7ciBpbmMtYnVsay1kMTRjLXBsb3Qtc2V0dXB9CiMgYmluZCByb3dzIG9mIGluYyBsaXN0CnNyYS4xOS5pbmMgPC0gc3JhLjIwMTkuaW5jLnN1bS5kZgpzcmEuMTkuaW5jJFR5cGUgPC0gImluYyIKCiMgMjAwMQpzcmEuMDEuaW5jIDwtIHNyYS4yMDAxLmluYy5zdW0uZGYKc3JhLjAxLmluYyRUeXBlIDwtICJpbmMiCgojIHJiaW5kIGJ1bGsgZGF0YQpzcmEuMTkuYnVsayA8LSBzcmEuMTkuc3VtW3doaWNoKHNyYS4xOS5zdW0kbHlyX2JvdCA8IDMxKSwgYygiWWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIsImQxNGMiLCAiZDE0Y19sIiwgImQxNGNfdSIpXQpuYW1lcyhzcmEuMTkuYnVsaylbd2hpY2gobmFtZXMoc3JhLjE5LmJ1bGspID09ICJkMTRjIildIDwtICJkMTRjX21lYW4iCnNyYS4xOS5idWxrJFR5cGUgPC0gImJ1bGsiCnNyYS4xOS5idWxrIDwtIHNyYS4xOS5idWxrICU+JQogIG11dGF0ZShwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIFBNID0gTlVMTCwKICAgICAgICAgRUNPID0gTlVMTCkKc3JhLjE5LmluYy5ibGsgPC0gcmJpbmQoZGF0YS5mcmFtZShzcmEuMTkuaW5jKSwgZGF0YS5mcmFtZShzcmEuMTkuYnVsaykpCnNhdmUoc3JhLjE5LmluYy5ibGssIGZpbGUgPSAic3JhLjE5LmluYy5ibGsuUkRhdGEiKQoKIyAyMDAxCiMgTmVlZCB0byBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiByYWRpb2NhcmJvbiB2YWx1ZXMgYW5kIHN0b2NrcyBmb3IgY29tYmluZWQgaW5jIGRlcHRocyAKIyAxKSBhZGQgU09DIHN0b2NrcyB0byBkdXBsaWNhdGUgc3JhLjIwMDEubHMgb2JqCnNyYS4yMDAxLmxzMiA8LSBzcmEuMjAwMS5scwpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMDEubHMyKSkgewogIGl4IDwtIG1hdGNoKHNyYS4yMDAxLmxzMltbaV1dW1siSUQiXV0sIHNvYy4yMDAxLmxzW1tpXV1bWyJJRCJdXSkKICBzcmEuMjAwMS5sczJbW2ldXVsibHlyX3NvY19rZ20yIl0gPC0gc29jLjIwMDEubHNbW2ldXVtpeCwgImx5cl9zb2Nfa2dtMiJdCn0KIyAyKSB3ZWlnaHRlZCBhdmVyYWdlIGZ4CmQxZDIuMTRjLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgc3VtX3NvYyA8LSBzdW0oZGZbMToyLCAibHlyX3NvY19rZ20yIl0pCiAgd3QxIDwtIGRmJGx5cl9zb2Nfa2dtMlsxXSAvIHN1bV9zb2MKICB3dDIgPC0gZGYkbHlyX3NvY19rZ20yWzJdIC8gc3VtX3NvYwogIGQxZDIgPC0gZGZbMSwgXQogIGQxZDIkSUQgPSBwYXN0ZShkZiRQTWVjb1sxXSwgZGYkcHJvX3JlcFsxXSwgZGYkbHlyX3RvcFsxXSwgZGYkbHlyX2JvdFsyXSwgc2VwID0gIl8iKQogIGQxZDIkbHlyX3NvY19rZ20yID0gc3VtKGRmJGx5cl9zb2Nfa2dtMlsxXSwgZGYkbHlyX3NvY19rZ20yWzJdKQogIGQxZDIkbHlyX2JvdCA9IGRmJGx5cl9ib3RbMl0KICBkMWQyJGZtIDwtIHN1bShkZiRmbVsxXSAqIHd0MSwgZGYkZm1bMl0gKiB3dDIpCiAgZDFkMiRkMTRjIDwtIHN1bShkZiRkMTRjWzFdICogd3QxLCBkZiRkMTRjWzJdICogd3QyKQogIHJldHVybihyYmluZChkMWQyLAogICAgICAgICAgICAgICBkZlszOm5yb3coZGYpLCBdKSkKfQojIDMpIGNhbGMuIHd0ZC4gYXZlcmFnZSBmb3IgR1JyZgpzcmEuMjAwMS5sczIkR1JyZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmxzMiRHUnJmLCBzcmEuMjAwMS5sczIkR1JyZiRwcm9fcmVwKSwgZnVuY3Rpb24oeCkgewogICAgZDFkMi4xNGMuZngoeCkKICB9KQopCiMgNCkgY2FsYy4gd3RkLiBhdmVyYWdlIGZvciBCU3JmCiMgICAgLSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBvbmx5IG9uZSBwcm9fcmVwIGhhcyAwLTMgY20gZGF0YQojICAgIC0gc28sIG5lZWQgdG8gY2FsY3VsYXRlIHdlaWdodGVkIFNPQywgdGhlbiBjYWxjdWxhdGUgd2VpZ2h0ZWQgMTRDCiMgICAgLSBjb21wb3NpdGUgMC04ID0gMTVnIEJTcmZfMV8wLTMgKyA1IGcgZnJvbSBlYWNoIHByb19yZXAgQlNyZl8zLTgKQlNyZl9jb21wXzAxX2kgPC0gc3JhLjIwMDEubHMyJEJTcmZbd2hpY2goc3JhLjIwMDEubHMkQlNyZiRseXJfYm90IDwgOSksIF0KQlNyZl9jb21wXzAxX2kkc29jX3d0IDwtIGMoMTUgLyAzMCwgcmVwKDUgLyAzMCwgMykpCkJTcmZfY29tcF8wMV9pJHNvY193dGQgPC0gQlNyZl9jb21wXzAxX2kkbHlyX3NvY19rZ20yICogQlNyZl9jb21wXzAxX2kkc29jX3d0CgojIGNyZWF0ZSBzdW1tYXJpemVkIGxpc3QKc3JhLjIwMDEuc3VtLmxzMiAgPC0gbGFwcGx5KHNyYS4yMDAxLmxzMiwgZnVuY3Rpb24oZGYpIHsKICBkYXRhLmZyYW1lKAogICAgZGYgJT4lCiAgICAgIGZpbHRlcihseXJfYm90IDw9IDQwKSAlPiUKICAgICAgbXV0YXRlKGx5cl9ib3RfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX2JvdCkpICU+JQogICAgICBzZWxlY3QoUE1lY28sIGQxNGMsIGZtLCBseXJfYm90X2NoLCBseXJfc29jX2tnbTIpICU+JQogICAgICBncm91cF9ieShQTWVjbywgbHlyX2JvdF9jaCkgJT4lCiAgICAgIHN1bW1hcml6ZSgKICAgICAgICBhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgICAgbXV0YXRlKGx5cl9ib3QgPSBhcy5udW1lcmljKGx5cl9ib3RfY2gpKSAlPiUKICAgICAgc2VsZWN0KC1seXJfYm90X2NoKQogICkKfSkKCiMgcmVtb3ZlIEJTcmYgcm93IHcvIGx5cl9ib3QgPSAzCnNyYS4yMDAxLnN1bS5sczIkQlNyZiA8LSBzcmEuMjAwMS5zdW0ubHMyJEJTcmZbLXdoaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDMpLCBdCiMgY2FsY3VsYXRlIHdlaWdodGVkIGF2ZXJhZ2UgZm9yIGQxNGMsIGZtLCBseXJfc29jX2tnbTIKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCAiZDE0Y19tZWFuIl0gPC0gc3VtKEJTcmZfY29tcF8wMV9pJGQxNGMgKiAoQlNyZl9jb21wXzAxX2kkc29jX3d0ZCAvIHN1bShCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkKSkpCnNyYS4yMDAxLnN1bS5sczIkQlNyZlt3aGljaChzcmEuMjAwMS5zdW0ubHMyJEJTcmYkbHlyX2JvdCA9PSA4KSwgImZtX21lYW4iXSA8LSBzdW0oQlNyZl9jb21wXzAxX2kkZm0gKiAoQlNyZl9jb21wXzAxX2kkc29jX3d0ZCAvIHN1bShCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkKSkpCnNyYS4yMDAxLnN1bS5sczIkQlNyZlt3aGljaChzcmEuMjAwMS5zdW0ubHMyJEJTcmYkbHlyX2JvdCA9PSA4KSwgImx5cl9zb2Nfa2dtMl9tZWFuIl0gPC0gc3VtKEJTcmZfY29tcF8wMV9pJHNvY193dGQpCnNyYS4yMDAxLnN1bS5sczIkQlNyZlt3aGljaChzcmEuMjAwMS5zdW0ubHMyJEJTcmYkbHlyX2JvdCA9PSA4KSwgYygiZDE0Y19zZCIsICJmbV9zZCIsICJseXJfc29jX2tnbTJfc2QiKV0gPC0gTkEKCiMgY2FsY3VsYXRlIGNtdHYgc29jCnNyYS4yMDAxLnN1bS5sczIgPC0gbGFwcGx5KHNyYS4yMDAxLnN1bS5sczIsIGZ1bmN0aW9uKHgpIHsKICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXQogIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJfbWVhbltpXQogICAgICB9IGVsc2UgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yX21lYW5baV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgfQogIHJldHVybih4KQp9KQoKIyBtYWtlIGRmCnNyYS4wMS5zdW0gPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MoCiAgbGFwcGx5KHNyYS4yMDAxLnN1bS5sczIsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiAlPiUKICAgICAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInBwIiwgZGYkUE1lY28pLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBkZiRQTWVjbyksICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICBwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBkZiRQTWVjbyksICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgZGYkUE1lY28pLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgICAgICBkMTRjX3UgPSBkMTRjX21lYW4gKyBkMTRjX3NkLAogICAgICAgICAgICAgZDE0Y19sID0gZDE0Y19tZWFuIC0gZDE0Y19zZCwKICAgICAgICAgICAgIFllYXIgPSAyMDAxLAogICAgICAgICAgICAgVHlwZSA9ICJidWxrIikgJT4lCiAgICAgIHNlbGVjdChuYW1lcyhzcmEuMDEuaW5jKSkgJT4lCiAgICAgIGFycmFuZ2UobHlyX2JvdCkKICB9KQopKQojIGJpbmQgd2l0aCBpbmMKc3JhLjAxLmluYy5ibGsgPC0gcmJpbmQoZGF0YS5mcmFtZShzcmEuMDEuaW5jKSwgc3JhLjAxLnN1bSkKc2F2ZShzcmEuMDEuaW5jLmJsaywgZmlsZSA9ICJzcmEuMDEuaW5jLmJsay5SRGF0YSIpCmBgYAoKYGBge3IgcGxvdC1pbmMtYmxrLTIwMTl9CiMgcGxvdCAyMDE5CmZpZy5uIDwtIGZpZy5uICsgMQojIHAgPC0Kc3JhLjE5LmluYy5ibGsgJT4lCiAgbXV0YXRlKEVDT3R5cGUgPSBwYXN0ZTAoZWNvLCAiICgiLCBUeXBlLCAiKSIpKSAlPiUKICBhcnJhbmdlKGx5cl9ib3QpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDT3R5cGUsIGxpbmV0eXBlID0gVHlwZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGJ1bGspIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChidWxrKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoaW5jKSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoaW5jKSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgZ2dzYXZlKCJzcmEuYnVsa0luYy4xOS5wZGYiLCBwLCBkZXZpY2UgPSBjYWlyb19wZGYsIHdpZHRoID0gOS41LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCBhbmQgcmVzcGlyZWQgQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsLCBwb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgYnVsayBzb2lscyBhbmQgc2luZ2xlIG9ic2VydmF0aW9ucyBmb3IgcmVzcGlyZWQgQ09+Mn4uIAoKYGBge3IgcGxvdC1pbmMtYmxrLTIwMDF9CiMgcGxvdCAyMDAxCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDEuaW5jLmJsayAlPiUKICBtdXRhdGUoRUNPdHlwZSA9IHBhc3RlMChlY28sICIgKCIsIFR5cGUsICIpIikpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDT3R5cGUsIGxpbmV0eXBlID0gVHlwZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGJ1bGspIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChidWxrKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoaW5jKSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoaW5jKSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDAsIDIwMCkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gJFxEZWx0YSReMTReQyBvZiAyMDAxIGJ1bGsgc29pbCBpbmN1YmF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBidWxrIHNvaWwqKgoKPipDYXB0aW9uOiogJFxEZWx0YSReMTReQyBvZiBidWxrIHNvaWwgYW5kIHJlc3BpcmVkIENPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gUG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIGJ1bGsgc29pbHMgYW5kIG1lYW4gb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGZvciByZXNwaXJlZCBDT34yfi4gVGhlIGluY3ViYXRlZCBzb2lsIHNhbXBsZXMgYXJlIGEgY29tcG9zaXRlIG1hZGUgYnkgaG9tb2dlbml6aW5nIHN1YnNhbXBsZXMgZnJvbSBlYWNoIG9mIHRoZSB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZSBzYW1wbGVzIGJ5IGRlcHRoLiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsIGFuZCB0aGUgbWVhc3VyZWQgdmFsdWVzIGZyb20gbGFib3JhdG9yeSBkdXBsaWNhdGVzIG9mIHRoZSBpbmN1YmF0ZWQgY29tcG9zaXRlIHNhbXBsZXMuCgpgYGB7ciBwcmVwLWluYy1ieS1idWxrLTE0Yy1wbG90fQojIGZpcnN0IG1lcmdlIG1lYW4gMTRDIGRhdGEgZnJvbSAyMDE5IHNhbXBsZXMgd2l0aCBjb21wb3NpdGUgaW5jdWJhdGlvbiBkYXRhCm5tcy5pbmMuYmxrIDwtIGMoInBtIiwgImVjbyIsICJseXJfYm90IiwgIlllYXIiKQpzcmEuMTkuaW5jLmJsazIgPC0gbGVmdF9qb2luKHNyYS4xOS5idWxrICU+JSBtdXRhdGUoLiwgWWVhciA9IGFzLmZhY3RvcihZZWFyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLnN1bS5kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG5tcy5pbmMuYmxrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi5idWxrIiwgIi5pbmMiKSkKIyAyMDAxCnNyYS4wMS5pbmMuYmxrMiA8LSBsZWZ0X2pvaW4oc3JhLjAxLnN1bSAlPiUgbXV0YXRlKC4sIFllYXIgPSBhcy5mYWN0b3IoWWVhcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYS4wMS5pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBubXMuaW5jLmJsaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCIuYnVsayIsICIuaW5jIikpCnNyYS4wMS5pbmMuYmxrMiRQTWVjbyA8LSBwYXN0ZTAoc3JhLjAxLmluYy5ibGsyJHBtLCBzcmEuMDEuaW5jLmJsazIkZWNvKQojIGFkZCBkZXB0aCBmYWN0b3IKc3JhLjAxLmluYy5ibGsyIDwtIHVuc3BsaXQoCiAgbGFwcGx5KHNwbGl0KHNyYS4wMS5pbmMuYmxrMiwgc3JhLjAxLmluYy5ibGsyJFBNZWNvKSwgZnVuY3Rpb24oeCkgewogIHgkZGVwdGggPC0gc2VxKDEsIG5yb3coeCkpCiAgcmV0dXJuKHgpIAogIH0pLCAKc3JhLjAxLmluYy5ibGsyJFBNZWNvKQpzcmEuMDEuaW5jLmJsazIgPC0gc3JhLjAxLmluYy5ibGsyW3doaWNoKHNyYS4wMS5pbmMuYmxrMiRseXJfYm90IDwgMzUpLCBdCnNyYS4wMS5pbmMuYmxrMiRkZXB0aCA8LSBmYWN0b3Ioc3JhLjAxLmluYy5ibGsyJGRlcHRoKQoKIyByZWdyZXNzIGJ1bGsgdnMuIGluYwptaW4uaW5jLmJsay4xOSA8LSBtaW4oc3JhLjE5LmluYy5ibGsyJGQxNGNfbC5pbmMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMTkuaW5jLmJsazIkZDE0Y19sLmJ1bGspICMgZXhjbHVkZSBoaWdobHkgbmVnYXRpdmUgaW5jdWJhdGlvbiBzYW1wbGUgZnJvbSBHUndmCm1heC5pbmMuYmxrLjE5IDwtIG1heChzcmEuMTkuaW5jLmJsazIkZDE0Y19sLmluYywKICAgICAgICAgICAgICAgICAgICAgIHNyYS4xOS5pbmMuYmxrMiRkMTRjX2wuYnVsaykKCiMgV2hhdCBpcyB0aGUgaWRlYWwgZ3JvdXBpbmcvZXhwZWN0ZWQgcmVsYXRpb25zaGlwPwpgYGAKCmBgYHtyIHBsb3QtaW5jLWJ5LWJ1bGstMTRjfQojIyBsb29rIGF0IGNvbWJpbmF0b3JpYWwgZGF0YXNldAojIHNyYS5hbGwuZGYuZnggPC0gZnVuY3Rpb24obHMsIHllYXIpIHsKIyAgIGNiaW5kKGJpbmRfcm93cyhsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSBkZlsgLCBjKCJQTWVjbyIsICJseXJfYm90IiwgImQxNGMiKV0pKSwKIyAgICAgICAgIHllYXIgPSB5ZWFyKQojIH0KIyBzcmEuYWxsLmRmIDwtIGlubmVyX2pvaW4oCiMgICByYmluZChzcmEuYWxsLmRmLmZ4KHNyYS4yMDAxLmxzLCAyMDAxKSwKIyAgICAgICAgIHNyYS5hbGwuZGYuZngoc3JhLjIwMTkubHMsIDIwMTkpKSwKIyAgIHJiaW5kKHNyYS5hbGwuZGYuZngoc3JhLjIwMDEuaW5jLmxzLCAyMDAxKSwKIyAgICAgICAgIHNyYS5hbGwuZGYuZngoc3JhLjIwMTkuaW5jLmxzLCAyMDE5KSksCiMgICBieSA9IGMoIlBNZWNvIiwgImx5cl9ib3QiLCAieWVhciIpLAojICAgc3VmZml4ID0gYygiX2J1bGsiLCAiX2luYyIpKQojIHNyYS5hbGwuZGYgPC0gc3JhLmFsbC5kZiAlPiUKIyAgIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiMgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSkKIyAKIyBzcmEuYWxsLmRmICU+JQojICAgZmlsdGVyKGQxNGNfaW5jID4gLTEzMCkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKGQxNGNfYnVsaywgZDE0Y19pbmMsIGNvbG9yID0gUE0pKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKIyAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgYWVzKGZpbGwgPSBQTSkpICsKIyAgIGdlb21fcG9pbnQoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIikpICsKIyAgICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIikpICsKIyAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKC0xMzAsIDIwMCksIHlsaW0gPSBjKC0xMzAsIDIwMCkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQnVsayBzb2lsICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojICAgCiMgc3VtbWFyeShsbShkMTRjX2luYyB+IGQxNGNfYnVsayAqIFBNLCBzcmEuYWxsLmRmW3NyYS5hbGwuZGYkZDE0Y19pbmMgPiAtMTMwLCBdKSkKCiMgam9pbiBhbGwgZGF0YSBhcyBtZWFucyBhbmQgc2RzCnNyYS5hbGwuc3VtLmRmIDwtIGxlZnRfam9pbigKICBiaW5kX3Jvd3Moc3JhLjIwMDEuc3VtLmxzMikgJT4lCiAgICBzZWxlY3QoUE1lY28sIGx5cl9ib3QsIGQxNGNfbWVhbiwgZDE0Y19zZCkgJT4lCiAgICBtdXRhdGUoWWVhciA9IDIwMDEpICU+JQogICAgYmluZF9yb3dzKC4sIAogICAgICAgICAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgICAgICAgICBkZiAlPiUKICAgICAgICAgICAgICAgICAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgICAgICAgICAgICAgICAgIHNlbGVjdChQTWVjbywgbHlyX2JvdCwgZDE0YykgJT4lCiAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfYm90KSAlPiUKICAgICAgICAgICAgICAgICAgc3VtbWFyaXplKGFjcm9zcyhkMTRjLCBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkpICU+JQogICAgICAgICAgICAgICAgICBtdXRhdGUoWWVhciA9IDIwMTkpCiAgICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgKSwKICBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDAxLmluYy5scywgZnVuY3Rpb24oZGYpIHsKICAgICAgICAgICAgICBkZiAlPiUKICAgICAgICAgICAgICAgIHNlbGVjdChQTWVjbywgbHlyX2JvdCwgZDE0YykgJT4lCiAgICAgICAgICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX2JvdCkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUoYWNyb3NzKGQxNGMsIGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGUoWWVhciA9IDIwMDEpIAogICAgICAgICAgICAgIH0pKSAlPiUKICBiaW5kX3Jvd3MoLiwgCiAgICAgICAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3JhLjIwMTkuaW5jLmxzLCBmdW5jdGlvbihkZikgewogICAgICAgICAgICAgIGRmICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfYm90LCBkMTRjKSAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfYm90KSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcml6ZShhY3Jvc3MoZDE0YywgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZShZZWFyID0gMjAxOSkKICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgKSwgCiAgYnkgPSBjKCJQTWVjbyIsICJseXJfYm90IiwgIlllYXIiKSwKICBzdWZmaXggPSBjKCIuYnVsayIsICIuaW5jIikpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cmluZyhQTWVjbywgMSwgMiksCiAgICAgICAgIGVjbyA9IHN1YnN0cmluZyhQTWVjbywgMywgNCkpCgojIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBvZiBtZWFucwpzdW1tYXJ5KGxtKGQxNGNfbWVhbi5pbmMgfiBkMTRjX21lYW4uYnVsayAqIFBNLCBzcmEuYWxsLnN1bS5kZltzcmEuYWxsLnN1bS5kZiRkMTRjX21lYW4uaW5jID4gLTIwMCwgXSkpCgojIGxhcHBseShzcGxpdChzcmEuYWxsLnN1bS5kZiwgc3JhLmFsbC5zdW0uZGYkZWNvKSwgZnVuY3Rpb24oZGYpIHsKIyAgIHN1bW1hcnkobG0oZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrICogUE0sIGRmKSkKIyB9KQoKIyAjIERlbWluZyByZWdyZXNzaW9uIChhY2NvdW50cyBmb3IgZXJyb3IgaW4geCBhbmQgeSB0ZXJtcykKIyBzcmEuZGVtIDwtIGxhcHBseShzcGxpdChzcmEuYWxsLnN1bS5kZiwgc3JhLmFsbC5zdW0uZGYkUE0pLCBmdW5jdGlvbihkZikgewojICAgZGVtaW5nKGQxNGNfbWVhbi5pbmMgfiBkMTRjX21lYW4uYnVsaywKIyAgICAgICAgZGF0YSA9IGRmLCB4c3RkID0gZDE0Y19zZC5pbmMsIHlzdGQgPSBkMTRjX3NkLmJ1bGspCiMgfSkKCiMgYWxsIGRlcHRocyBhbmQgeWVhcnMgdG9nZXRoZXIsIGJ5IFBNCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuaW5jLmJsazIgICU+JQogIGJpbmRfcm93cyguLCBzcmEuMDEuaW5jLmJsazJbICwgd2hpY2gobmFtZXMoc3JhLjE5LmluYy5ibGsyKSAlaW4lIG5hbWVzKHNyYS4wMS5pbmMuYmxrMikpXSkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZmlsdGVyKGQxNGNfbWVhbi5pbmMgPiAtMjAwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbi5idWxrLCBkMTRjX21lYW4uaW5jLCBjb2xvciA9IHBtKSkgKwogICMgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbC5idWxrLCAKICAgICAgICB4bWF4ID0gZDE0Y191LmJ1bGssCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sLmluYywgCiAgICAgICAgeW1heCA9IGQxNGNfdS5pbmMsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgd2lkdGggPSAxLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDE5KSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtICgyMDAxKSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMDEpIiA9IDE3KSkgKwogIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKC0xMDAsIDIwMCksIHlsaW0gPSBjKC0xMDAsIDIwMCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgIyBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojICMgMjAwMQojIHNyYS4wMS5pbmMuYmxrMiAlPiUKIyAgIGZpbHRlcihkMTRjX21lYW4uYnVsayA+IC0xMDAgJiBkMTRjX21lYW4uaW5jID4gLTEwMCkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbi5idWxrLCBkMTRjX21lYW4uaW5jLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgZ3JvdXAgPSBwbSkpICsKIyAgICMgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiMgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfbC5idWxrLCAKIyAgICAgICAgIHhtYXggPSBkMTRjX3UuYnVsaywKIyAgICAgICAgIGNvbG9yID0gcG0pLCAKIyAgICAgaGVpZ2h0ID0gMS41KSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGQxNGNfbC5pbmMsIAojICAgICAgICAgeW1heCA9IGQxNGNfdS5pbmMsCiMgICAgICAgICBjb2xvciA9IHBtKSwgCiMgICAgIHdpZHRoID0gMS41KSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKIyAgIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKC0xMDAsIDIwMCksIHlsaW0gPSBjKC0xMDAsIDIwMCkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQnVsayBzb2lsICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyAKIyAjIDIwMTkKIyBmaWcubiA8LSBmaWcubiArIDEKIyBzcmEuMTkuaW5jLmJsazIgJT4lCiMgICBtdXRhdGUoZGVwdGggPSBmYWN0b3IobHlyX2JvdCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4uYnVsaywgZDE0Y19tZWFuLmluYywgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gcG0pKSArCiMgICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFKSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2wuYnVsaywgCiMgICAgICAgICB4bWF4ID0gZDE0Y191LmJ1bGssCiMgICAgICAgICBjb2xvciA9IHBtKSwgCiMgICAgIGhlaWdodCA9IDEuNSkgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2wuaW5jLCAKIyAgICAgICAgIHltYXggPSBkMTRjX3UuaW5jLAojICAgICAgICAgY29sb3IgPSBwbSksIAojICAgICB3aWR0aCA9IDEuNSkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiMgICBjb29yZF9maXhlZCh4bGltID0gYygtMTAwLCAyMDApLCB5bGltID0gYygtMTAwLCAyMDApKSArCiMgICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBSZWdyZXNzaW9uIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFJlZ3Jlc3Npb25zIG9mICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIGFuZCByZXNwaXJlZCBDT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBidWxrIHNvaWwsIHBvaW50cyBzaG93IG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciBidWxrIHNvaWxzIGFuZCBzaW5nbGUgb2JzZXJ2YXRpb25zIGZvciByZXNwaXJlZCBDT34yfi4KCiMjIFRpbWUgc2VyaWVzOiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIChhcyBtZWFzdXJlZCkKYGBge3IgcGxvdC10aW1lc2VyaWVzLW1lYXMtZGVwdGhzfQojIGNvbWJpbmUgJzAxLCAnMDksICcxOSBkYXRhCnNyYS4wMS4wOS4xOS5yYXcgPC0gcmJpbmQoYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpCnNyYS4yMDA5LmxzIDwtIHNwbGl0KHJhczE4Lmx5ciwgcmFzMTgubHlyJFBNZWNvKQpzcmEuMjAwOS5kZiA8LSBiaW5kX3Jvd3Moc3JhLjIwMDkubHMpCmNvbG5hbWVzKHNyYS4yMDA5LmRmKVt3aGljaChjb2xuYW1lcyhzcmEuMjAwOS5kZikgPT0gImx5cl8xNGMiKV0gPC0gImQxNGMiCnNyYS4yMDA5LmRmIDwtIHNyYS4yMDA5LmRmWyAsIHdoaWNoKG5hbWVzKHNyYS4yMDA5LmRmKSAlaW4lIG5hbWVzKHNyYS4wMS4wOS4xOS5yYXcpKV0Kc3JhLjIwMDkuZGYgPC0gY2JpbmQoc3JhLjIwMDkuZGYsIAogICAgICAgICAgICAgICAgICAgICBmbSA9IE5BLAogICAgICAgICAgICAgICAgICAgICBkMTRjX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgIGQxNGNfdSA9IE5BLAogICAgICAgICAgICAgICAgICAgICBkMTRjX2wgPSBOQSkKc3JhLjAxLjA5LjE5LnJhdyA8LSByYmluZChzcmEuMDEuMDkuMTkucmF3LCBzcmEuMjAwOS5kZikKc3JhLjAxLjA5LjE5LnJhdyRZZWFyIDwtIGZhY3RvcihjKHJlcCgyMDAxLCBucm93KGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoMjAxOSwgbnJvdyhiaW5kX3Jvd3Moc3JhLjIwMTkuc3VtLmxzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKDIwMDksIG5yb3coc3JhLjIwMDkuZGYpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMjAwMSIsICIyMDA5IiwgIjIwMTkiKSkKCiMgcGxvdAojIHcvIHJpYmJvbnMKIyBzcmEuMDEuMDkuMTkucmF3ICU+JQojICAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAojICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKIyAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKIyAgICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKIyAgICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAojICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBncm91cCA9IFBNZWNvX3llYXIpKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3JpYmJvbihhZXMoeG1pbiA9IGQxNGNfbCwgeG1heCA9IGQxNGNfdSwgZmlsbCA9IHBtLCBhbHBoYSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhciksCiMgICAgICAgICAgICAgICBjb2xvciA9IE5BLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiMgICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcG0sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBhbHBoYSA9IFllYXIpLCBzaXplID0gMikgKwojICAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArCiMgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKIyAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDIyLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDIxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDI0KSkgKwojICAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gLjYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjIpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwojICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGxpdHRlcgpzcmEuMjAxOS5pbmMuTC5kZiA8LSBkYXRhLmZyYW1lKAogIHNyYS4yMDE5LmluY19MLmRmICU+JQogICAgZ3JvdXBfYnkoWWVhciwgUE0sIGVjbywgbHlyX2JvdCwgUE1lY28pICU+JQogICAgc3VtbWFyaXplKGFjcm9zcyguY29scyA9IGQxNGMsIAogICAgICAgICAgICAgICAgICAgICAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgbWluID0gbWluLCBtYXggPSBtYXgpKSkgJT4lCiAgICByZW5hbWUoeWVhciA9IFllYXIsIGQxNGMgPSBkMTRjX21lYW4pICU+JQogICAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoZWNvID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY28gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkpCiMgZm9yIHBsb3R0aW5nIGJlbG93CnNyYS4yMDE5LmluYy5MLmRmMiA8LSBzcmEuMjAxOS5pbmMuTC5kZiAlPiUKICByZW5hbWUoZDE0Y19sID0gZDE0Y19taW4sCiAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWF4KSAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgeWVhcikpCgojIHdpdGggZXJyb3IgYmFycywgYWxsIGRlcHRocwpzcmEuMDEuMDkuMTkucmF3ICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcG0sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBhbHBoYSA9IFllYXIpLCBzaXplID0gMy41KSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3JhLjIwMTkuaW5jLkwuZGYyLCAKICAgICAgICAgICAgIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbyksIHNoYXBlID0gOCwgc2l6ZSA9IDMuNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyLCBjb2xvciA9IHBtKSwgc2l6ZSA9IDAuNykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtLAogICAgICAgIGFscGhhID0gWWVhciksCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDMpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMganVzdCB0b3Bzb2lsLCB3LyBlcnJvciBiYXJzCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDEuMDkuMTkucmF3IDwtIHNyYS4wMS4wOS4xOS5yYXdbb3JkZXIoc3JhLjAxLjA5LjE5LnJhdyRseXJfdG9wKSwgXQpzcmEuMDEuMDkuMTkucmF3ICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcG0sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBhbHBoYSA9IFllYXIpLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyLCBjb2xvciA9IHBtKSwgc2l6ZSA9IDAuNykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtLAogICAgICAgIGFscGhhID0gWWVhciksCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MSwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTYwLCAxOTApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gInNvbGlkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAiZG90dGVkIikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gVGltZSBzZXJpZXMgb2YgJFxEZWx0YSReMTReQyBieSBkZXB0aCwgYXMgbWVhc3VyZWQqKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSBwcm9maWxlIHJlcGxpY2F0ZXMgZm9yIDIwMDEsIDIwMDksIGFuZCAyMDE5IHNhbXBsZXMuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gU3RhcnMgc2hvdyBsaXR0ZXIgaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGZvciAyMDE5IHNhbXBsZXMgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgojIyBTcGxpbmUgZml0dGluZwoKU29pbHMgY29sbGVjdGVkIGluIGJvdGggdGhlIDIwMDEgYW5kIDIwMDkgc2FtcGxpbmcgY2FtcGFpZ25zIHdlcmUgc2FtcGxlZCBieSBob3Jpem9uLCBidXQgdGhlIGRlcHRoIGludGVydmFscyBkaWZmZXJlZCBiZXR3ZWVuIHRoZSB0d28gc2FtcGxpbmcgeWVhcnMuIEluIDIwMDksIGZ1bGwgcHJvZmlsZXMgd2VyZSBleGNhdmF0ZWQgZm9yIGVhY2ggc2l0ZSwgYXMgb3Bwb3NlZCB0byB0aGUgc2hvcnRlciBwcm9maWxlcyBjb2xsZWN0ZWQgaW4gMjAwMSBmcm9tIHRoZSBHUiBhbmQgQU4gc2l0ZXMuIFJhZGlvY2FyYm9uIHdhcyBtZWFzdXJlZCBvbiBhbGwgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBmb3IgdGhlIDIwMDEgc2FtcGxlcywgYnV0IG9ubHkgZm9yIG9uZSBvZiB0aGUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBpbiAyMDA5LCBlLmcuIEFOcHAgcmVwMiwgZXRjLgoKSW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgcmFkaW9jYXJib24gcHJvZmlsZXMgYmV0d2VlbiAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3ZSBmaXJzdCBpbnRlcnBvbGF0ZWQgYm90aCByYWRpb2NhcmJvbiBhbmQgY2FyYm9uIHN0b2NrIGRhdGEgYXQgMSBjbSBpbnRlcnZhbHMgZm9yIGVhY2ggc2l0ZSBpbiB0aGUgZGF0YXNldHMgZnJvbSBlYWNoIHllYXIuIFRoZSBjYXJib24tc3RvY2std2VpZ2h0ZWQgcmFkaW9jYXJib24gdmFsdWVzIGZvciBhbnkgZ2l2ZW4gdGFyZ2V0IGRlcHRoIGludGVydmFsIGNhbiB0aGVuIGJlIGNhbGN1bGF0ZWQgYXMgYSBzaW1wbGUgc3VtIG9mIHRoZSBwcm9kdWN0IG9mIHRoZSBjYXJib24gd2VpZ2h0IG9mIGVhY2ggMSBjbSBpbmNyZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3RhbCBjYXJib24gc3RvY2sgb2YgdGhlIHRhcmdldCBkZXB0aCBpbnRlcnZhbCkgYW5kIGl0cyByYWRpb2NhcmJvbiB2YWx1ZS4gQSBtb25vdG9uaWMgY3ViaWMgc3BsaW5lIGZpdCB3YXMgdXNlZCBmb3IgdGhlIGNhcmJvbiBzdG9jayBpbnRlcnBvbGF0aW9uIChXZW5kdCBhbmQgSGF1c2VyIDIwMTMpLCBhbmQgYSBtYXNzLXByZXNlcnZpbmcgc3BsaW5lIHdhcyB1c2VkIHRvIGZpdCB0aGUgcmFkaW9jYXJib24gZGF0YSAoQmlzaG9wLCBULkYuQS4sIE1jQnJhdG5leSwgQS5CLiwgTGFzbGV0dCwgRy5NLiwgKDE5OTkpIE1vZGVsbGluZyBzb2lsIGF0dHJpYnV0ZSBkZXB0aCBmdW5jdGlvbnMgd2l0aCBlcXVhbC1hcmVhIHF1YWRyYXRpYyBzbW9vdGhpbmcgc3BsaW5lcy4gR2VvZGVybWEsIDkxKDEtMik6IDI3LTQ1KS4KCmBgYHtyIGNuLWNsZWFuLCBpbmNsdWRlID0gRkFMU0V9CmVsbV9yZXN1bHRzX2RmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKIyBTcGxpdCBJRHMKUE1lY29fcmVwX2RlcHRoIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3Ryc3BsaXQoZWxtX3Jlc3VsdHNfZGYkSUQsICJfIiksIGZ1bmN0aW9uKHgpIHsgCiAgICBkZiA8LSAgZGF0YS5mcmFtZShQTWVjbyA9IHhbMl0sCiAgICAgICAgICAgICAgICAgICAgICBwcm9fcmVwID0geFszXSwKICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0geFs0XSkKICAgIGRmJFBNIDwtIHN1YnN0cihkZiRQTWVjbywgMSwgMikKICAgIGRmJEVDTyA8LSBzdWJzdHIoZGYkUE1lY28sIDMsIDQpCiAgICByZXR1cm4oZGYpCiAgfSkKKQplbG1fcmVzdWx0c19kZiA8LSBjYmluZChlbG1fcmVzdWx0c19kZiwgUE1lY29fcmVwX2RlcHRoKQpgYGAKCmBgYHtyIHNvYy0yMDAxLCBpbmNsdWRlID0gRkFMU0V9CiMgbWVyZ2Ugc29jLjIwMDEubHMgYW5kIHNyYS4yMDAxLmxzIHRvIGFkZCBTT0MgZGF0YQpzcmEuMjAwMS5scyA8LSBtYXBwbHkobWVyZ2UsIHNyYS4yMDAxLmxzLCBzb2MuMjAwMS5scywgU0lNUExJRlkgPSBGQUxTRSkKCiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgc3RvY2tzCnNyYS4yMDAxLmxzIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBzcGxpdChkZiwgZGYkcHJvX25hbWUpCiAgbHMgPC0gbGFwcGx5KGxzLCBmdW5jdGlvbih4KSB7CiAgICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXSAjIG1ha2Ugc3VyZSB0byBvcmRlciBkYXRhCiAgICB4JGx5cl9zb2NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybih4KQogIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIGRmJHByb19uYW1lKSkKfSkKYGBgCgpgYGB7ciBzcGxpbmUtZm0sIGluY2x1ZGUgPSBGQUxTRX0KIyMjIHNwbGluZSBmaXQgZm9yIGZtCiMjIGJ1bGsgKHNwbGl0IGJ5IHBybyByZXApCiMgMjAwMQpzcmEuMjAwMS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQojIDIwMDkKc3JhLjIwMDkuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbih4KSB7CiAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJseXJfZnJhY3Rpb25fbW9kZXJuIikKICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICByZXR1cm4oeC5tcHMpCn0pCiMgMjAxOQpzcmEuMjAxOS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQoKIyMgaW5jCiMgbmVlZCBtaW4gYW5kIG1heCB2YWx1ZXMgZm9yIHNwbGluZSBmaXRzCiMgMjAwMQpzcmEuMjAwMS5pbmMuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDAxLmluYy5zdW0ubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZXB0aHMoZGYpIDwtIFBNZWNvIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIG1lYW4ubXBzIDwtIG1wc3BsaW5lKGRmLCB2YXIubmFtZSA9ICJmbV9tZWFuIikKICAgIG1pbi5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX2wiKQogICAgbWF4Lm1wcyA8LSBtcHNwbGluZShkZiwgdmFyLm5hbWUgPSAiZm1fdSIpCiAgICByZXR1cm4obGlzdChtZWFuLnZhci4xY20gPSBtZWFuLm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSwKICAgICAgICAgICAgICAgIG1pbi52YXIuMWNtID0gbWluLm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSwKICAgICAgICAgICAgICAgIG1heC52YXIuMWNtID0gbWF4Lm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSkpCiAgfSkKYGBgCgpgYGB7ciBzcGxpbmUtYmQtc29jLTE5LCBpbmNsdWRlID0gRkFMU0V9CiMgTmVlZCBTT0Mgc3RvY2sgZGF0YSBmb3IgMjAxOSBzYW1wbGVzOiB1c2UgQkQgZnJvbSAyMDA5IHNhbXBsZXMgCiMgc3BsaW5lIGZpdCBmb3IgYnVsayBkZW5zaXR5CnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5scywgZnVuY3Rpb24oeCkgewogIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibHlyX2JkX3NhbXAiKQogIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOjEwMF0KICByZXR1cm4oeC5tcHMpCn0pCnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5iZC5zcCwgZnVuY3Rpb24obHMpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGxzWyJ2YXIuMWNtIl0pCiAgaXggPC0gd2hpY2goaXMubmEoZGYkdmFyLjFjbSkpCiAgZGYkdmFyLjFjbVtpeF0gPC0gZGYkdmFyLjFjbVtpeFsxXS0xXQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIG1lYW4gb2YgMWNtIEJEIHByZWRpY3Rpb25zIGZvciBlYWNoIGRlcHRoIGluY3JlbWVudApiZF9wcmVkIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkuYmQuc3ApLCBmdW5jdGlvbihpKSB7CiAgbHMgPC0gc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSAjIHNwbGl0IGVhY2ggcmVwbGljYXRlIHByb2ZpbGUKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gbHNbW2RmXV1bWyJseXJfYm90Il1dICMgZGVwdGggaW50ZXJ2YWxzCiAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpICMgdmVjdG9yIGZvciBhdmVyYWdpbmcgMSBjbSBiZCBwcmVkCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgY1tbal1dIDwtIG1lYW4oc3JhLjIwMDkuYmQuc3BbW2ldXVsxOmRbal0sICJ2YXIuMWNtIl0pICMgMS0xMAogICAgICB9IGVsc2UgewogICAgICAgIGNbW2pdXSA8LSBtZWFuKHNyYS4yMDA5LmJkLnNwW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAidmFyLjFjbSJdKSAjIDEwIGNtIGluY3JlbWVudHMKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChjKSkKICAgIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIHNyYS4yMDE5LmxzW1tpXV1bInByb19yZXAiXSkpCn0pCgojIG1lcmdlIHByZWRpY3RlZCBiZCB2YWx1ZXMgd2l0aCBzcmEuMjAxOS5scwpubXMgPC0gbmFtZXMoc3JhLjIwMTkubHMpCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkubHMpLCBmdW5jdGlvbihkZikgewogIGNiaW5kKHNyYS4yMDE5LmxzW1tkZl1dLCBiZCA9IGJkX3ByZWRbW2RmXV0pCn0pCm5hbWVzKHNyYS4yMDE5LmxzKSA8LSBubXMKCiMgYWRkIGMgY29uYwpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZGVwdGggPC0gcGFzdGUwKGRmJGx5cl90b3AsICItIiwgZGYkbHlyX2JvdCkKICBkZiA8LSBtZXJnZShkZiwgZWxtX3Jlc3VsdHNfZGZbICwgYygiUE1lY28iLCAicHJvX3JlcCIsICJkZXB0aCIsICJDIiwgIk4iKV0sIGJ5ID0gYygiUE1lY28iLCAiZGVwdGgiLCAicHJvX3JlcCIpKQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIHN0b2NrcyAgCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jIDwtIGRmJGJkICogZGYkQyAjIHVuaXRzIHdvcmsgb3V0IHRvIGtnX20yIAogIHJldHVybihkZikKfSkKIyBjYWxjdWxhdGUgY210diBzdG9ja3MKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KQogIHJldHVybih1bnNwbGl0KGxzLCBkZiRwcm9fbmFtZSkpCn0pCnNhdmUoc3JhLjIwMTkubHMsIGZpbGUgPSAic3JhLjIwMTkubHMuUkRhdGEiKQpgYGAKCmBgYHtyIHNwbGluZS1zb2MsIGluY2x1ZGUgPSBGQUxTRX0KIyBzcGxpbmUgZml0IGZvciBjYXJib24gc3RvY2tzIChmb3IgY2FsYyB3ZWlnaHRlZCBhdmVyYWdlcykKZGVwdGguc3BsaW5lIDwtIGZ1bmN0aW9uKHgpIHsKICBzcCA8LSBzcGxpbmUoeCwgbWV0aG9kID0gImh5bWFuIikgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogIHNwLnNzIDwtIHNtb290aC5zcGxpbmUoc3ApICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgc3RkIDwtIHNlcSgwLCAxMDApICMgaW4gY20gKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogIGRmIDwtIGRhdGEuZnJhbWUoc3ApCiAgY29sbmFtZXMoZGYpIDwtIGMoImx5cl9ib3QiLCJseXJfc29jIikKICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkbHlyX2JvdCkpIHsKICAgIGlmKGkgPT0gMSkgewogICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NbaV0KICAgIH0gZWxzZSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpICsgMV0gLSBkZiRseXJfc29jW2ldCiAgICB9CiAgfQogIGRmIDwtIGRmWy0xLF0KICByZXR1cm4oZGZbLWxlbmd0aChkZiRseXJfc29jKSwgXSkKfQoKIyMgYWRkICgwLCAwKSBwb2ludCBmb3IgKGx5cl9ib3QsIGx5cl9jbXR2X3N0b2NrKQojIDIwMDEKc3JhLjIwMDEuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB0MCA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gMSwgbmNvbCA9IG5jb2woeCkpKQogICAgeHkgPC0gYyh3aGljaChuYW1lcyh4KSA9PSAibHlyX2JvdCIpLCB3aGljaChuYW1lcyh4KSA9PSAibHlyX3NvY19jbXR2IikpCiAgICB0MFsgLCB4eV0gPC0gMAogICAgbmFtZXModDApIDwtIG5hbWVzKHgpCiAgICB0MCRwcm9fbmFtZSA8LSB1bmlxdWUoeCRwcm9fbmFtZSkKICAgIHJldHVybihyYmluZCh0MCwgeCkpCiAgfSkKICByZXR1cm4oYmluZF9yb3dzKGxzKSkKfSkKc3JhLjIwMDEuc3AubHMuYXZnIDwtIGxhcHBseShzcmEuMjAwMS5zdW0ubHMyLCBmdW5jdGlvbihkZikgewogIHh5IDwtIGRmWyAsIGMoImx5cl9ib3QiLCAibHlyX3NvY19jbXR2IildCiAgdDAgPC0gZGF0YS5mcmFtZShseXJfYm90ID0gMCwgbHlyX3NvY19jbXR2ID0gMCkKICByZXR1cm4ocmJpbmQoeHkpKQp9KQojIDIwMDkKc3JhLjIwMDkuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbihkZikgewogIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbChkZikpKQogIHh5IDwtIGMod2hpY2gobmFtZXMoZGYpID09ICJseXJfYm90IiksIHdoaWNoKG5hbWVzKGRmKSA9PSAibHlyX3NvY19jbXR2IikpCiAgdDBbICwgeHldIDwtIDAKICBuYW1lcyh0MCkgPC0gbmFtZXMoZGYpCiAgbmV3IDwtIHJiaW5kKHQwLCBkZikKICByZXR1cm4obmV3KQp9KQojIDIwMTkKc3JhLjIwMTkuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB0MCA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gMSwgbmNvbCA9IG5jb2woeCkpKQogICAgeHkgPC0gYyh3aGljaChuYW1lcyh4KSA9PSAibHlyX2JvdCIpLCB3aGljaChuYW1lcyh4KSA9PSAibHlyX3NvY19jbXR2IikpCiAgICB0MFsgLCB4eV0gPC0gMAogICAgbmFtZXModDApIDwtIG5hbWVzKHgpCiAgICB0MCRwcm9fbmFtZSA8LSB1bmlxdWUoeCRwcm9fbmFtZSkKICAgIHJldHVybihyYmluZCh0MCwgeCkpCiAgfSkKICByZXR1cm4oYmluZF9yb3dzKGxzKSkKfSkKCiMjIHJ1biBzcGxpbmUKIyAyMDAxCnNyYS4yMDAxLm9jLnNwIDwtIGxhcHBseShzcmEuMjAwMS5zcC5scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGguc3BsaW5lKHhbLCBjKCJseXJfYm90IiwgImx5cl9zb2NfY210diIpXSkKICB9KQp9KQpzcmEuMjAwMS5vYy5zcC5hdmcgPC0gbGFwcGx5KHNyYS4yMDAxLnNwLmxzLmF2ZywgZnVuY3Rpb24oZGYpIHsKICBkZXB0aC5zcGxpbmUoZGYpCn0pCiMgMjAwOQpzcmEuMjAwOS5vYy5zcCA8LSBsYXBwbHkoc3JhLjIwMDkuc3AubHMsIGZ1bmN0aW9uKHgpIHsKICBkZXB0aC5zcGxpbmUoeFssIGMoImx5cl9ib3QiLCAibHlyX3NvY19jbXR2IildKQp9KQojIDIwMTkKc3JhLjIwMTkub2Muc3AgPC0gbGFwcGx5KHNyYS4yMDE5LnNwLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICBkZXB0aC5zcGxpbmUoeFssIGMoImx5cl9ib3QiLCAibHlyX3NvY19jbXR2IildKQogIH0pCn0pCmBgYAoKYGBge3IgY3d0LWQxNGMtMDEsIGluY2x1ZGUgPSBGQUxTRX0KIyMgY2FsY3VsYXRlIHN0b2NrIHdlaWdodHMKIyMgMjAwMSBkZXB0aHMKIyBvcmRlciAnMDEgZGF0YQpzcmEuMjAwMS5zdW0ubHMgPC0gbGFwcGx5KHNyYS4yMDAxLnN1bS5scywgZnVuY3Rpb24oZGYpIGRmW29yZGVyKGRmJGx5cl9ib3QpLCBdKQojIDIwMDkKY3d0LjAxLjA5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0gIyBtYXAgb250byAnMDEgZGVwdGhzCiAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgaWYoaiA9PSAxKSB7CiAgICAgIGNbW2pdXSA8LSBzcmEuMjAwOS5vYy5zcFtbaV1dWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgfSBlbHNlIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgfQogIH0KICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKSAjIHJldHVybiB3ZWlnaHRzCn0pCm5hbWVzKGN3dC4wMS4wOSkgPC0gbmFtZXMoc3JhLjIwMDkub2Muc3ApCiMgMjAxOSAoc2Vjb25kIGxpc3QgbGV2ZWwgZnJvbSBwcm9maWxlIHJlcHMpCmN3dC4wMS4xOSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5Lm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGxhcHBseShzcmEuMjAxOS5vYy5zcFtbaV1dLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0gIyBtYXAgb250byAnMDEgZGVwdGhzCiAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgY1tbal1dIDwtIGRmWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgICB9IGVsc2UgewogICAgICAgIGNbW2pdXSA8LSBkZlsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpICAjIHJldHVybiB3ZWlnaHRzCiAgfSkKfSkKbmFtZXMoY3d0LjAxLjE5KSA8LSBuYW1lcyhzcmEuMjAxOS5vYy5zcCkKCgojIyBjYWxjdWxhdGUgZm1fd3RzCiMjICcwMSBkZXB0aHMKIyAyMDE5CmZtLnd0LjAxLjE5IDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjAxLjE5KSwgZnVuY3Rpb24oaSkgewogIGxhcHBseShzZXFfYWxvbmcoY3d0LjAxLjE5W1tpXV0pLCBmdW5jdGlvbihqKSB7CiAgICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4wMS4xOVtbaV1dW1tqXV0pCiAgICBkZiRmbSA8LSBzcmEuMjAxOS5mbS5zcFtbaV1dW1tqXV1bWyJ2YXIuMWNtIl1dWzE6bGVuZ3RoKGN3dC4wMS4xOVtbaV1dW1tqXV0pXQogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCiAgfSkKfSkgCm5hbWVzKGZtLnd0LjAxLjE5KSA8LSBuYW1lcyhjd3QuMDEuMTkpCiMgMjAwOQpmbS53dC4wMS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4wMS4wOSksIGZ1bmN0aW9uKGkpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4wMS4wOVtbaV1dKQogIGRmJGZtIDwtIHNyYS4yMDA5LmZtLnNwW1tpXV1bWyJ2YXIuMWNtIl1dWzE6bGVuZ3RoKGN3dC4wMS4wOVtbaV1dKV0KICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKfSkKbmFtZXMoZm0ud3QuMDEuMDkpIDwtIG5hbWVzKGN3dC4wMS4wOSkKCgojIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmbSBmb3IgZWFjaCBpbnRlcnZhbAojIyAnMDEgZGVwdGhzCiMgMjAwOQpzcmEuMDEuMDkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4wOVtbaV1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICB9IGVsc2UgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjA5W1tpXV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgIH0KICB9CiAgcmV0dXJuKGNiaW5kKHNyYS4yMDAxLnN1bS5sc1tbaV1dLCBmbV8wOSA9IHVubGlzdChmKSkpCn0pCm5hbWVzKHNyYS4wMS4wOS5scykgPC0gbmFtZXMoZm0ud3QuMDEuMDkpCiMgMjAxOQpzcmEuMDEuMTkubHMgPC0gZm0ud3QuMDEuMTkgIyBpbml0aWFsaXplIGxpc3Qgd2l0aCBmbSB3dCBzdHJ1Y3R1cmUKc3JhLjAxLjE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIHNyYS4wMS4xOS5sc1tbaV1dIDwtIGxhcHBseShzZXFfYWxvbmcoZm0ud3QuMDEuMTlbW2ldXSksIGZ1bmN0aW9uKHgpIHsKICAgIGQgPC0gc3JhLjIwMDEuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4xOVtbaV1dW1t4XV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjE5W1tpXV1bW3hdXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGYpKSAKICB9KQogIGZtIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjAxLjE5LmxzW1tpXV1bWzFdXSksIGZ1bmN0aW9uKHopIHsKICAgIGRhdGEuZnJhbWUoZm1fMTlfbWVhbiA9IG1lYW4oc2FwcGx5KHNyYS4wMS4xOS5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICBmbV8xOV9zZCA9IHNkKHNhcHBseShzcmEuMDEuMTkubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSkKICAgIH0pCiAgZm0gPC0gYmluZF9yb3dzKGZtKQogIHJldHVybihmbSkKfSkKc3JhLjAxLjA5LjE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjAxLjA5LmxzKSwgZnVuY3Rpb24oaSkgewogIGRhdGEuZnJhbWUoc3JhLjAxLjA5LmxzW1tpXV0sIHNyYS4wMS4xOS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuMDEuMDkuMTkubHMpIDwtIG5hbWVzKHNyYS4wMS4wOS5scykKCiMjIGNyZWF0ZSB0aWR5IGNvbWJpbmVkICcwMSwgJzA5LCAnMTkgZGF0YSBmcmFtZQpubXMgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJmbSIsICJmbV9zZCIpCnNyYS4wMS4wOS4xOS5kZiA8LSBiaW5kX3Jvd3Moc3JhLjAxLjA5LjE5LmxzKQpzcmEuMDEuMDkuMTkgPC0gc3JhLjAxLjA5LjE5LmRmWywgbm1zXQpzcmEuMDEuMDkuMTkgPC0gcmJpbmQoY2JpbmQoc3JhLjAxLjA5LjE5LCBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDEpKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjAxLjA5LjE5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4wMS4wOS4xOS5kZiRmbV8wOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDA5KSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHNyYS4wMS4wOS4xOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMDEuMDkuMTkuZGYkZm1fMTlfbWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBzcmEuMDEuMDkuMTkuZGYkZm1fMTlfc2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAxOSkpKQoKIyBjYWxjIGQxNGMgZnJvbSBmbQpzcmEuMDEuMDkuMTkkZDE0YyA8LSBjYWxjXzE0YyhzcmEuMDEuMDkuMTkkZm0sIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4wMS4wOS4xOSRZZWFyKSkpCnNyYS4wMS4wOS4xOSRkMTRjX3NkIDwtIGFicyhzcmEuMDEuMDkuMTkkZDE0YyAtIGNhbGNfMTRjKHNyYS4wMS4wOS4xOSRmbSArIHNyYS4wMS4wOS4xOSRmbV9zZCwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjAxLjA5LjE5JFllYXIpKSkpCmBgYAoKYGBge3IgY3d0LWQxNGMtMTksIGluY2x1ZGUgPSBGQUxTRX0KIyMgY2FsY3VsYXRlIHN0b2NrIHdlaWdodHMKIyMgMjAxOSBkZXB0aHMKIyAyMDAxCmN3dC4xOS4wMSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGxhcHBseShzcmEuMjAwMS5vYy5zcFtbaV1dLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gZGZbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIGRmWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKICB9KQp9KQpuYW1lcyhjd3QuMTkuMDEpIDwtIG5hbWVzKHNyYS4yMDAxLm9jLnNwKQojIDIwMDEgbWVhbgpjd3QuMTkuMDEuYXZnIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEub2Muc3AuYXZnKSwgZnVuY3Rpb24oaSkgewogICAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gc3JhLjIwMDEub2Muc3AuYXZnW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIHNyYS4yMDAxLm9jLnNwLmF2Z1tbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKfSkKbmFtZXMoY3d0LjE5LjAxLmF2ZykgPC0gbmFtZXMoc3JhLjIwMDEub2Muc3ApCgojIDIwMDkKY3d0LjE5LjA5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICB9IGVsc2UgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICB9CiAgfQogIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpCn0pCm5hbWVzKGN3dC4xOS4wOSkgPC0gbmFtZXMoc3JhLjIwMDkub2Muc3ApCgojIyBjYWxjdWxhdGUgZm1fd3RzCiMjICcxOSBkZXB0aHMKIyMgYnVsawojIDIwMDEKZm0ud3QuMTkuMDEgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDEpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDFbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjAxW1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDAxLmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5LjAxW1tpXV1bW2pdXSldCiAgICAjIGxpbmVhciBleHRyYXBvbGF0aW9uIGZvciBmaWxsaW5nIDIwLTMwY20gZm0gZGF0YQogICAgZm1fMV8zMCA8LSBkZiRmbVsxOjMwXSAjIDAtMzBjbSBmbQogICAgaWYobGVuZ3RoKHdoaWNoKGlzLm5hKGZtXzFfMzApKSkgPiAwKSB7CiAgICAgaXggPC0gd2hpY2goaXMubmEoZm1fMV8zMCkpCiAgICAgaXgubWluIDwtIG1pbihpeCkgIyBmaXJzdCBpcy5uYShmbSkKICAgICBtIDwtIGZtXzFfMzBbaXgubWluLTFdLWZtXzFfMzBbaXgubWluLTJdICMgc2xvcGUgYXQgbGFzdCB0d28gbWVhc3VyZW1lbnQgcG9pbnRzCiAgICAgZm9yKGkgaW4gaXgubWluOjMwKSB7CiAgICAgIGZtXzFfMzBbaV0gPC0gZm1fMV8zMFtpIC0gMV0gKyBtIAogICAgIH0KICAgICBkZiRmbVsxOjMwXSA8LSBmbV8xXzMwIAogICAgfQogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCiAgfSkKfSkKbmFtZXMoZm0ud3QuMTkuMDEpIDwtIG5hbWVzKGN3dC4xOS4wMSkKIyAnMDEgaW5jCmZtLnd0LjE5LjAxLmluYyA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMS5hdmcpLCBmdW5jdGlvbihqKSB7CiAgbGFwcGx5KHNyYS4yMDAxLmluYy5mbS5zcFtbal1dLCBmdW5jdGlvbihmbSkgewogICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDEuYXZnW1tqXV1bMTozMF0pCiAgICAjIGxpbmVhciBleHRyYXBvbGF0aW9uIGZvciBmaWxsaW5nIDIwLTMwY20gZm0gZGF0YQogICAgaWYgKGxlbmd0aChmbSkgPj0gMzApIHsKICAgICAgZm1fMV8zMCA8LSBmbVsxOjMwXSAjIDAtMzBjbSBmbQogICAgfSBlbHNlIHsKICAgICAgZm1fMV8zMCA8LSByZXAoTkEsIDMwKQogICAgICBmbV8xXzMwWzE6bGVuZ3RoKGZtKV0gPC0gZm0KICAgICAgIyBmaXJzdCBpcy5uYShmbSkKICAgICAgaXgubWluIDwtIG1pbih3aGljaChpcy5uYShmbV8xXzMwKSkpCiAgICAgICMgc2xvcGUgYXQgbGFzdCB0d28gbWVhc3VyZW1lbnQgcG9pbnRzCiAgICAgIG0gPC0gZm1fMV8zMFtpeC5taW4gLSAxXSAtIGZtXzFfMzBbaXgubWluIC0gMl0KICAgICAgZm9yKHggaW4gaXgubWluOjMwKSB7CiAgICAgICAgZm1fMV8zMFt4XSA8LSBmbV8xXzMwW3ggLSAxXSArIG0KICAgICAgfQogICAgfQogICAgZGYkZm1bMTozMF0gPC0gZm1fMV8zMCAKICAgIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgICByZXR1cm4oZGYpCiAgfSkKfSkKbmFtZXMoZm0ud3QuMTkuMDEuaW5jKSA8LSBuYW1lcyhjd3QuMTkuMDEuYXZnKQoKIyAyMDA5CmZtLnd0LjE5LjA5IDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjE5LjA5KSwgZnVuY3Rpb24oaSkgewogIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjA5W1tpXV0pCiAgZGYkZm0gPC0gc3JhLjIwMDkuZm0uc3BbW2ldXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5LjA5W1tpXV0pXQogIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQp9KQpuYW1lcyhmbS53dC4xOS4wOSkgPC0gbmFtZXMoY3d0LjE5LjA5KQoKIyMgY2FsY3VsYXRlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgZm0gZm9yIGVhY2ggaW50ZXJ2YWwKIyMgJzE5IGRlcHRocwojIDIwMDEKIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgc3BsaW5lIHZhbHVlcyBmb3IgZWFjaCBwcm9maWxlIHJlcApzcmEuMTkuMDEucmVwLmxzIDwtIGZtLnd0LjE5LjAxCnNyYS4xOS4wMS5yZXAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgc3JhLjE5LjAxLnJlcC5sc1tbaV1dIDwtIGxhcHBseShzZXFfYWxvbmcoZm0ud3QuMTkuMDFbW2ldXSksIGZ1bmN0aW9uKHgpIHsKICAgIGQgPC0gc3JhLjIwMTkuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wMVtbaV1dW1t4XV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjAxW1tpXV1bW3hdXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGYpKSAKICB9KX0pCnNyYS4xOS4wMS5yZXAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEucmVwLmxzKSwgZnVuY3Rpb24oaSkgewogIG5hbWVzKHNyYS4xOS4wMS5yZXAubHNbW2ldXSkgPC0gbmFtZXMoY3d0LjE5LjAxW1tpXV0pCiAgcmV0dXJuKHNyYS4xOS4wMS5yZXAubHNbW2ldXSkKfSkKbmFtZXMoc3JhLjE5LjAxLnJlcC5scykgPC0gbmFtZXMoZm0ud3QuMTkuMDEpCnNhdmUoc3JhLjE5LjAxLnJlcC5scywgZmlsZSA9ICJzcmEuMTkuMDEucmVwLmxzLlJEYXRhIikKCiMgYXZlcmFnZSByZXBzCnNyYS4xOS4wMS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBmbSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5yZXAubHNbW2ldXVtbMV1dKSwgZnVuY3Rpb24oeikgewogICAgZGF0YS5mcmFtZShmbV8wMV9tZWFuID0gbWVhbihzYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICBmbV8wMV9zZCA9IHNkKHNhcHBseShzcmEuMTkuMDEucmVwLmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSkpCiAgICB9KQogIHJldHVybihiaW5kX3Jvd3MoZm0pKQp9KQpuYW1lcyhzcmEuMTkuMDEubHMpIDwtIG5hbWVzKGZtLnd0LjE5LjAxKQoKIyMgJzAxIGluYwpzcmEuMTkuMDEuaW5jLmxzIDwtIGxhcHBseShmbS53dC4xOS4wMS5pbmMsIGZ1bmN0aW9uKGxzKSB7CiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBjKDEwLCAyMCwgMzApCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShkZlsxOmRbal0sICJmbV93dCJdKQogICAgICB9IGVsc2UgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZGZbKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChmKSkgCiAgfSl9KQoKIyAyMDA5CnNyYS4xOS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjA5W1tpXV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgIH0gZWxzZSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDlbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgfQogIH0KICByZXR1cm4oY2JpbmQoc3JhLjIwMTkuc3VtLmxzW1tpXV0sIGZtXzA5ID0gdW5saXN0KGYpKSkKfSkKbmFtZXMoc3JhLjE5LjA5LmxzKSA8LSBuYW1lcyhzcmEuMTkuMDEubHMpCgojIGNvbWJpbmUKc3JhLjE5LjAxLjA5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLmxzKSwgZnVuY3Rpb24oaSkgewogIGRhdGEuZnJhbWUoc3JhLjE5LjAxLmxzW1tpXV0sIHNyYS4xOS4wOS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuMTkuMDEuMDkubHMpIDwtIG5hbWVzKHNyYS4xOS4wMS5scykKCiMjIGNyZWF0ZSB0aWR5IGNvbWJpbmVkICcwMSwgJzA5LCAnMTkgZGF0YSBmcmFtZQpzcmEuMTkuMDEuMDkuZGYgPC0gYmluZF9yb3dzKHNyYS4xOS4wMS4wOS5scykKc3JhLjE5LjAxLjA5IDwtIHNyYS4xOS4wMS4wOS5kZlssIG5tc10Kc3JhLjE5LjAxLjA5IDwtIHJiaW5kKGRhdGEuZnJhbWUoc3JhLjE5LjAxLjA5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wMV9tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wMV9zZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDAxKSksCiAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjE5LjAxLjA5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjE5LjAxLjA5LmRmJGZtXzA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDA5KSksCiAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHNyYS4xOS4wMS4wOSwgWWVhciA9IGFzLmNoYXJhY3RlcigyMDE5KSkpCgojIGNhbGMgZDE0YyBmcm9tIGZtCnNyYS4xOS4wMS4wOSRkMTRjIDwtIGNhbGNfMTRjKHNyYS4xOS4wMS4wOSRmbSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjE5LjAxLjA5JFllYXIpKSkKc3JhLjE5LjAxLjA5JGQxNGNfc2QgPC0gYWJzKHNyYS4xOS4wMS4wOSRkMTRjIC0gY2FsY18xNGMoc3JhLjE5LjAxLjA5JGZtICsgc3JhLjE5LjAxLjA5JGZtX3NkLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMTkuMDEuMDkkWWVhcikpKSkKc2F2ZShzcmEuMTkuMDEuMDksIGZpbGUgPSAic3JhLjE5LjAxLjA5LlJEYXRhIikKYGBgCgpgYGB7ciBwbG90LTAxLTA5LTE5LTE0Yy1wcm9maWxlc30KZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4wMS4wOS4xOSAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogICMgZmlsdGVyKFllYXIgIT0gIjIwMDkiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBsaW5ldHlwZSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAic29saWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gImRvdHRlZCIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFRpbWUgc2VyaWVzIG9mIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DIGJ5IDIwMDEgZGVwdGhzICgyMDAxLCAyMDA5LCAyMDE5IHNhbXBsZXMpKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBmb3IgMjAwMSBzYW1wbGVzIHNob3cgdGhlIG1lYW4gJFxEZWx0YSReMTReQyB2YWx1ZXMgYXQgdGhlIG1lYXN1cmVkIGRlcHRocy4gUG9pbnRzIGZvciAyMDA5IGFuZCAyMDE5IHNhbXBsZXMgYXJlIHNwbGluZS1maXR0ZWQgZXN0aW1hdGVzIG9mICRcRGVsdGEkXjE0XkMgcHJlZGljdGVkIGZvciB0aGUgc2FtZSBkZXB0aCBpbnRlcnZhbHMgYXMgbWVhc3VyZWQgaW4gMjAwMS4gRXJyb3IgYmFycyBzaG93IMKxIDEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgMjAwMSBhbmQgMjAxOSBzYW1wbGVzIChvbmx5IGEgc2luZ2xlIHByb2ZpbGUgd2FzIGFuYWx5emVkIGluIDIwMDkpLiAKCmBgYHtyIHBsb3QtMTktMDEtMDktMTRjLXByb2ZpbGVzfQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjE5LjAxLjA5ICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgbGluZXR5cGUgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IFllYXIpLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgIyBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygzMCwgMCkpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAic29saWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9ICJkb3R0ZWQiKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBUaW1lIHNlcmllcyBvZiBidWxrIHNvaWwgJFxEZWx0YSReMTReQyBieSBkZXB0aCAoc3BsaW5lZCB0byAyMDE5IGRlcHRocykqKgoKPipDYXB0aW9uOiogUG9pbnRzIGZvciAyMDE5IHNhbXBsZXMgc2hvdyB0aGUgbWVhbiAkXERlbHRhJF4xNF5DIHZhbHVlcyBhdCB0aGUgbWVhc3VyZWQgZGVwdGhzLiBQb2ludHMgZm9yIDIwMDEgYW5kIDIwMDkgc2FtcGxlcyBhcmUgc3BsaW5lLWZpdHRlZCBlc3RpbWF0ZXMgb2YgJFxEZWx0YSReMTReQyBwcmVkaWN0ZWQgZm9yIHRoZSBzYW1lIGRlcHRoIGludGVydmFscyBhcyBtZWFzdXJlZCBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrEgMSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMgKG9ubHkgYSBzaW5nbGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgaW4gMjAwOSkuIAo+Kk5COiBPbmx5IHR3byBkZXB0aCBpbnRlcnZhbHMgd2VyZSBtZWFzdXJlZCBhdCB0aGUgY29vbCBhbmQgY29sZCBhbmRlc2l0ZSBzaXRlcyAobWF4IGRlcHRoIG9mIDI3IGFuZCAyOCBjbSwgcmVzcGVjdGl2ZWx5KSwgc28gbGluZWFyIGV4dHJhcG9sYXRpb24gKHVzaW5nIHRoZSBzbG9wZSBvZiB0aGUgbGFzdCAxY20gc3BsaW5lLWZpdHRlZCBkZXB0aCBpbmNyZW1lbnQpIHdhcyB1c2VkIHRvIGV4dGVuZCB0aGUgcHJvZmlsZXMgdG8gMzAgY20uKgoKYGBge3IgcGxvdC1ieS1kZXB0aC0xNEMtdGltZXNlcmllc30KIyBwbG90IGluZGl2aWR1YWwgZGVwdGhzCmZpZy5uIDwtIGZpZy5uICsgMQoKIyBBdG0KYXRtLjE0YyA8LSBkYXRhLmZyYW1lKHllYXIgPSBEYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJEYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICBkMTRjID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiTkhjMTQiXSkKc2F2ZShhdG0uMTRjLCBmaWxlID0gImF0bS4xNGMuUkRhdGEiKQoKIyBidWxrIDE0QyBvdmVyIHRpbWUgZm9yIDAtMTAsIDEwLTIwLCAyMC0zMCB3LyBhdG0Kc3JhLjE5LjAxLjA5ICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogIG11dGF0ZShQTWVjb19kZXB0aCA9IHBhc3RlMChQTWVjbywgbHlyX2JvdCksCiAgICAgICAgIGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoWWVhcikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXIsIGQxNGMpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0uMTRjKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY28pLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgZ3JvdXAgPSBQTWVjb19kZXB0aCwgbGluZXR5cGUgPSBkZXB0aCksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sLCAKICAgICAgICB5bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIHdpZHRoID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gIkRlcHRoIChjbSkiLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxMCIgPSAiMC0xMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIiA9ICIxMC0yMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwIiA9ICIyMC0zMCIpLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIxMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMCIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMCIgPSAzKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKCJZZWFyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIyMgaW5jdWJhdGlvbgojIyAyMDE5CnNyYS4yMDE5LmluYy5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDE5LmluYy5scywgZnVuY3Rpb24oZGYpIHsKICBkYXRhLmZyYW1lKGRmICU+JQogICAgICAgICAgICAgICBncm91cF9ieShZZWFyLCBQTSwgRUNPLCBseXJfYm90LCBQTWVjbykgJT4lCiAgICAgICAgICAgICAgIHN1bW1hcml6ZSgKICAgICAgICAgICAgICAgICBhY3Jvc3MoLmNvbHMgPSBkMTRjLCAKICAgICAgICAgICAgICAgICAgICAgICAgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIG1pbiA9IG1pbiwgbWF4ID0gbWF4KSkpICU+JQogICAgICAgICAgICAgICByZW5hbWUoeWVhciA9IFllYXIsIGQxNGMgPSBkMTRjX21lYW4pKQp9KSkKIyMgMjAwMQpzcmEuMTkuMDEuaW5jLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5pbmMubHMpLCBmdW5jdGlvbihpKSB7CiAgUE1lY28gPC0gbmFtZXMoc3JhLjE5LjAxLmluYy5scylbaV0KICBkMTRjLmxzIDwtIGxhcHBseShzcmEuMTkuMDEuaW5jLmxzW1tpXV0sIGNhbGNfMTRjLCBvYnNfZGF0ZV95ID0gMjAwMSkKICBkZiA8LSBkYXRhLmZyYW1lKGQxNGMgPSBkMTRjLmxzW1sxXV0sCiAgICAgICAgICAgICAgICAgICBkMTRjX21pbiA9IGQxNGMubHNbWzJdXSwKICAgICAgICAgICAgICAgICAgIGQxNGNfbWF4ID0gZDE0Yy5sc1tbM11dLAogICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IGMoMTAsIDIwLCAzMCksCiAgICAgICAgICAgICAgICAgICBQTWVjbyA9IFBNZWNvLAogICAgICAgICAgICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICAgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSwKICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDAxKQogIHJldHVybihkZikKfSkpCnNyYS4xOS4wMS5pbmMgPC0gcmJpbmQoc3JhLjE5LjAxLmluYy5kZiwgc3JhLjIwMTkuaW5jLmRmKQoKIyBwbG90CnNyYS4xOS4wMS5pbmMgJT4lCiAgbXV0YXRlKFBNZWNvX2RlcHRoID0gcGFzdGUwKFBNZWNvLCBseXJfYm90KSwKICAgICAgICAgZGVwdGggPSBmYWN0b3IobHlyX2JvdCksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXIsIGQxNGMpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0uMTRjKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBlY28sIHNoYXBlID0gZWNvKSwgc2l6ZSA9IDMpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzcmEuMjAxOS5pbmMuTC5kZiwgYWVzKGNvbG9yID0gZWNvKSwgc2hhcGUgPSA4LCBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBlY28sIGdyb3VwID0gUE1lY28pLCBhbHBoYSA9IDAuMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19tYXgsCiAgICAgICAgY29sb3IgPSBlY28pLCAKICAgIHdpZHRoID0gLjUpICsKICBnZW9tX2Vycm9yYmFyKAogICAgZGF0YSA9IHNyYS4yMDE5LmluYy5MLmRmLAogICAgYWVzKHltaW4gPSBkMTRjX21pbiwgCiAgICAgICAgeW1heCA9IGQxNGNfbWF4LAogICAgICAgIGNvbG9yID0gZWNvKSwgCiAgICB3aWR0aCA9IC41KSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC00MCwgMTcwKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMocG0pLCBjb2xzID0gdmFycyhkZXB0aCkpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlllYXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBpbmMgYW5kIGJ1bGsgdG9nZXRoZXIsIGJ5IGRlcHRoCnNyYS50cy5hbGwgPC0gc3JhLjE5LjAxLjA5ICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogIHNlbGVjdChZZWFyLCBQTSwgRUNPLCBQTWVjbywgbHlyX2JvdCwgZDE0YywgZDE0Y19zZCkgJT4lCiAgbXV0YXRlKFR5cGUgPSAiYnVsayIsCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgeWVhciA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFllYXIpKSkgJT4lCiAgc2VsZWN0KC1kMTRjX3NkKSAlPiUKICBiaW5kX3Jvd3MoLiwKICAgICAgICAgICAgc3JhLjE5LjAxLmluYyAlPiUKICAgICAgICAgICAgICBzZWxlY3QoeWVhciwgUE0sIEVDTywgUE1lY28sIGx5cl9ib3QsIGQxNGMsIGQxNGNfbWluLCBkMTRjX21heCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKGQxNGNfbCA9IGQxNGNfbWluLAogICAgICAgICAgICAgICAgICAgICBkMTRjX3UgPSBkMTRjX21heCkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKFR5cGUgPSAiaW5jIikKICApICU+JQogIG11dGF0ZShkZXB0aCA9IGZhY3RvcihseXJfYm90KSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIGVjb1R5cGUgPSBwYXN0ZTAoZWNvLCAiICgiLCBUeXBlLCAiKSIpKQoKIyBQbG90IGJ5IGRlcHRoCnBsb3QudHMuZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIGZpbHRlcihkMTRjID4gLTIwMCkgJT4lCiAgICBmaWx0ZXIoeWVhciAhPSAyMDA5KSAlPiUKICAgIGdncGxvdCguLCBhZXMoeWVhciwgZDE0YykpICsKICAgIGdlb21fcGF0aChkYXRhID0gYXRtLjE0YykgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY29UeXBlKSwgc2l6ZSA9IDMpICsKICAgIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgbGluZXR5cGUgPSBUeXBlKSwgYWxwaGEgPSAwLjMpICsKICAgIGdlb21fZXJyb3JiYXIoCiAgICAgIGFlcyh5bWluID0gZDE0Y19sLCAKICAgICAgICAgIHltYXggPSBkMTRjX3UsCiAgICAgICAgICBjb2xvciA9IHBtKSwgCiAgICAgIHdpZHRoID0gLjUpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAodHlwZSkiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGluYykiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIChpbmMpIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKGJ1bGspIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGJ1bGspIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKGJ1bGspIiA9IDE3KSkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICAgIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICB4bGFiKCJZZWFyIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQp9CgojIHBsb3RzCmxhcHBseShzcGxpdChzcmEudHMuYWxsLCBzcmEudHMuYWxsJGRlcHRoKSwgcGxvdC50cy5meCkKCiMgIyB0byBzYXZlCiMgZm9yKGkgaW4gMTozKSBnZ3NhdmUocGFzdGUwKGksICIucGRmIiksIGxhcHBseShzcGxpdChzcmEudHMuYWxsLCBzcmEudHMuYWxsJGRlcHRoKSwgcGxvdC50cy5meClbW2ldXSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIENoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCAocGFuZWwgYSkgYW5kIHJlc3BpcmVkIENPfjJ+IChwYW5lbCBiKSBvdmVyIHRpbWUgcmVsYXRpdmUgdG8gdGhlIGF0bW9zcGhlcmUqKgoKPipDYXB0aW9uOiogUG9pbnRzIGZvciAyMDE5IHNhbXBsZXMgc2hvdyB0aGUgbWVhbiAkXERlbHRhJF4xNF5DIHZhbHVlcyBhdCB0aGUgbWVhc3VyZWQgZGVwdGhzLiBQb2ludHMgZm9yIDIwMDEgYW5kIDIwMDkgKGJ1bGsgb25seSkgc2FtcGxlcyBhcmUgc3BsaW5lLWZpdHRlZCBlc3RpbWF0ZXMgb2YgJFxEZWx0YSReMTReQyBwcmVkaWN0ZWQgZm9yIHRoZSBzYW1lIGRlcHRoIGludGVydmFscyBhcyBtZWFzdXJlZCBpbiAyMDE5LiBFcnJvciBiYXJzIGZvciBidWxrIHNhbXBsZXMgaW4gcGFuZWwgKGEpIHNob3cgwrEgMSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMgKG9ubHkgYSBzaW5nbGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgaW4gMjAwOSk7IGVycm9yIGJhcnMgZm9yIGluY3ViYXRpb24gc2FtcGxlcyBpbiBwYW5lbCAoYikgc2hvdyB0aGUgdmFsdWVzIG9mIHRoZSB0d28gcmVwcywgd2hpbGUgdGhlIHBvaW50IHJlcHJlc2VudHMgdGhlIG1lYW4uIAo+Kk5COiBPbmx5IHR3byBkZXB0aCBpbnRlcnZhbHMgd2VyZSBtZWFzdXJlZCBhdCB0aGUgY29vbCBhbmQgY29sZCBhbmRlc2l0ZSBzaXRlcyAobWF4IGRlcHRoIG9mIDI3IGFuZCAyOCBjbSwgcmVzcGVjdGl2ZWx5KSwgc28gbGluZWFyIGV4dHJhcG9sYXRpb24gKHVzaW5nIHRoZSBzbG9wZSBvZiB0aGUgbGFzdCAxY20gc3BsaW5lLWZpdHRlZCBkZXB0aCBpbmNyZW1lbnQpIHdhcyB1c2VkIHRvIGV4dGVuZCB0aGUgcHJvZmlsZXMgdG8gMzAgY20uKgoKYGBge3IgdHMtc3RhdHN9CiMgZnVuY3Rpb24gZm9yIFR1a2V5IEhTRCB0YWJsZXMKdHVrZXkudGFibGUuZnggPC0gZnVuY3Rpb24oeCwgeWVhciwgdHlwZSwgdmFyKSB7CiAgZGVwdGggPC0gcGFzdGUwKHVuaXF1ZSh4JGx5cl9ib3QpIC0gMTAsICItIiwgdW5pcXVlKHgkbHlyX2JvdCksICIgY20iKQogIGlmICh0eXBlID09ICJpbmMiKSB7CiAgICB4IDwtIHhbeCRkMTRjID4gLTIwMCwgYygiZDE0YyIsIHZhcildCiAgfSAKICByZXR1cm4oCiAgICBUdWtleUhTRChhb3YocmVmb3JtdWxhdGUodmFyLCAiZDE0YyIpLCB4KSlbdmFyXSAlPiUKICAgIGRhdGEuZnJhbWUoLikgJT4lCiAgICBtdXRhdGUoUGFpcnMgPSByb3duYW1lcyguKSkgJT4lCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCByb3VuZCwgMykpICU+JQogICAgZ3QoKSAlPiUKICAgIHRhYl9oZWFkZXIoCiAgICAgIHRpdGxlID0gZGVwdGgsCiAgICAgIHN1YnRpdGxlID0gcGFzdGUoeWVhciwgdHlwZSwgdmFyKQogICAgKSkKfQoKIyMjIDIwMDEKIyMgYnVsawpzcmEuMjAwMS5idWxrLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjE5LjAxLnJlcC5scywgZnVuY3Rpb24obHMpIHsKICAgIGxzIDwtIGxhcHBseShscywgZnVuY3Rpb24oeCkgeFtjb21wbGV0ZS5jYXNlcyh4KV0pCiAgICBkMTRjIDwtIGNhbGNfMTRjKHVubGlzdChscyksIDIwMDEpCiAgICBkZiA8LSBkYXRhLmZyYW1lKGQxNGMgPSBkMTRjLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gcmVwKGMoMTAsIDIwLCAzMCksIGxlbmd0aChkMTRjKSAvIDMpKQogICAgcmV0dXJuKGRmKQogIH0pLAogIC5pZCA9ICJQTWVjbyIpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpCiMgUE0KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMDEuYnVsay5kZiwgc3JhLjIwMDEuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgc3VtbWFyeShsbShkMTRjIH4gUE0sIHgpKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5idWxrLmRmLCBzcmEuMjAwMS5idWxrLmRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiYnVsayIsICJQTSIpCn0pCiMgRUNPCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmJ1bGsuZGYsIHNyYS4yMDAxLmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeCkpCiMgfSkKbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmJ1bGsuZGYsIHNyYS4yMDAxLmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICB0dWtleS50YWJsZS5meCh4LCAiMjAwMSIsICJidWxrIiwgIkVDTyIpCn0pCgojIyBpbmMKc3JhLjIwMDEuaW5jLmRmMiA8LSBjYmluZChzcmEuMTkuMDEuaW5jLmRmW3JlcCgxOm5yb3coc3JhLjE5LjAxLmluYy5kZiksIDIpLCBjKCJQTSIsICJFQ08iLCAibHlyX2JvdCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkMTRjID0gYyhzcmEuMTkuMDEuaW5jLmRmJGQxNGNfbWluLCBzcmEuMTkuMDEuaW5jLmRmJGQxNGNfbWF4KSkKc2F2ZShzcmEuMjAwMS5pbmMuZGYyLCBmaWxlID0gInNyYS4yMDAxLmluYy5kZjIuUkRhdGEiKQojIFBNCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmluYy5kZjIsIHNyYS4yMDAxLmluYy5kZjIkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IFBNLCB4W3gkZDE0YyA+IC0yMDAsIF0pKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYyLCBzcmEuMjAwMS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiaW5jIiwgIlBNIikKfSkKIyBFQ08KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMDEuaW5jLmRmMiwgc3JhLjIwMDEuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgc3VtbWFyeShsbShkMTRjIH4gRUNPLCB4W3gkZDE0YyA+IC0yMDAsIF0pKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYyLCBzcmEuMjAwMS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiaW5jIiwgIkVDTyIpCn0pCgojIyMgMjAxOQojIyBidWxrCnNyYS4yMDE5LmJ1bGsuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmxzKQojIFBNCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmJ1bGsuZGYsIHNyYS4yMDE5LmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIGlmIChucm93KHgpID09IDI3KSBzdW1tYXJ5KGxtKGQxNGMgfiBQTSwgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIGlmIChucm93KHgpID09IDI3KSB0dWtleS50YWJsZS5meCh4LCAiMjAxOSIsICJidWxrIiwgIlBNIikKfSkKIyBFQ08KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgaWYgKG5yb3coeCkgPT0gMjcpIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIGlmIChucm93KHgpID09IDI3KSB0dWtleS50YWJsZS5meCh4LCAiMjAxOSIsICJidWxrIiwgIkVDTyIpCn0pCiMjIGluYwpzcmEuMjAxOS5pbmMuZGYyIDwtIGJpbmRfcm93cyhzcmEuMjAxOS5pbmMubHMpCnNhdmUoc3JhLjIwMTkuaW5jLmRmMiwgZmlsZSA9ICJzcmEuMjAxOS5pbmMuZGYyLlJEYXRhIikKIyBQTQojIGxhcHBseShzcGxpdChzcmEuMjAxOS5pbmMuZGYyLCBzcmEuMjAxOS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiMgICBzdW1tYXJ5KGxtKGQxNGMgfiBQTSwgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmMiwgc3JhLjIwMTkuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIHR1a2V5LnRhYmxlLmZ4KHgsICIyMDE5IiwgImluYyIsICJQTSIpCn0pCiMgRUNPCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmluYy5kZjIsIHNyYS4yMDE5LmluYy5kZjIkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmMiwgc3JhLjIwMTkuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIHR1a2V5LnRhYmxlLmZ4KHgsICIyMDE5IiwgImluYyIsICJFQ08iKQp9KQoKIyBjb21wYXJlIDIwMDEgYW5kIDIwMTkKIyBidWxrCnNyYS4wMS4xOS5idWxrLmRmIDwtIGRhdGEuZnJhbWUoCiAgcmJpbmQoc3JhLjIwMDEuYnVsay5kZiwgCiAgICAgICAgc3JhLjIwMTkuYnVsay5kZlssIHdoaWNoKG5hbWVzKHNyYS4yMDE5LmJ1bGsuZGYpICVpbiUgbmFtZXMoc3JhLjIwMDEuYnVsay5kZikpXSksCiAgeWVhciA9IGFzLmZhY3RvcihjKHJlcCgyMDAxLCBucm93KHNyYS4yMDAxLmJ1bGsuZGYpKSwgcmVwKDIwMTksIG5yb3coc3JhLjIwMTkuYnVsay5kZikpKSkpICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpCnNyYS4wMS4xOS5idWxrLmxzIDwtIHNwbGl0KHNyYS4wMS4xOS5idWxrLmRmLCBzcmEuMDEuMTkuYnVsay5kZiRQTWVjbykKbGFwcGx5KHNyYS4wMS4xOS5idWxrLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHR1a2V5LnRhYmxlLmZ4KHgsIHBhc3RlMCh1bmlxdWUoZGYkUE1lY28pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImJ1bGsiLCAieWVhciIpCiAgfSkKfSkKIyBieSBQTQpsYXBwbHkoc3BsaXQoc3JhLjAxLjE5LmJ1bGsuZGYsIHNyYS4wMS4xOS5idWxrLmRmJFBNKSwgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgICB0dWtleS50YWJsZS5meCh4LCBwYXN0ZTAodW5pcXVlKGRmJFBNKSwgIiAyMDAxIHZzLiAyMDE5IiksICJidWxrIiwgInllYXIiKQogIH0pCn0pCiMgYnkgRUNPCmxhcHBseShzcGxpdChzcmEuMDEuMTkuYnVsay5kZiwgc3JhLjAxLjE5LmJ1bGsuZGYkRUNPKSwgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgICB0dWtleS50YWJsZS5meCh4LCBwYXN0ZTAodW5pcXVlKGRmJEVDTyksICIgMjAwMSB2cy4gMjAxOSIpLCAiYnVsayIsICJ5ZWFyIikKICB9KQp9KQojIGluYwpzcmEuMDEuMTkuaW5jLmRmIDwtIGRhdGEuZnJhbWUoCiAgZDE0YyA9IGMoc3JhLjE5LjAxLmluY1sgLCAiZDE0Y19taW4iXSwKICAgICAgICAgICBzcmEuMTkuMDEuaW5jWyAsICJkMTRjX21heCJdKSwKICBzcmEuMTkuMDEuaW5jWyAsIGMoIlBNZWNvIiwgImx5cl9ib3QiLCAiUE0iLCAiRUNPIiwgInllYXIiKV0pICU+JQogIG11dGF0ZSh5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQpzcmEuMDEuMTkuaW5jLmxzIDwtIHNwbGl0KHNyYS4wMS4xOS5pbmMuZGYsIHNyYS4wMS4xOS5pbmMuZGYkUE1lY28pCmxhcHBseShzcmEuMDEuMTkuaW5jLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHR1a2V5LnRhYmxlLmZ4KHgsIHBhc3RlMCh1bmlxdWUoZGYkUE1lY28pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImluYyIsICJ5ZWFyIikKICB9KQp9KQpsYXBwbHkoc3BsaXQoc3JhLjAxLjE5LmluYy5kZiwgc3JhLjAxLjE5LmluYy5kZiRQTSksIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgdHVrZXkudGFibGUuZngoeCwgcGFzdGUwKHVuaXF1ZShkZiRQTSksICIgMjAwMSB2cy4gMjAxOSIpLCAiaW5jIiwgInllYXIiKQogIH0pCn0pCmxhcHBseShzcGxpdChzcmEuMDEuMTkuaW5jLmRmLCBzcmEuMDEuMTkuaW5jLmRmJEVDTyksIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgdHVrZXkudGFibGUuZngoeCwgcGFzdGUwKHVuaXF1ZShkZiRFQ08pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImluYyIsICJ5ZWFyIikKICB9KQp9KQpgYGAKCmBgYHtyIHR1a2V5LXBsb3RzfQojIGNvbG9yIHBhbGV0dGVzIGZvciBFQ08gJiBQTQp3YXJtIDwtICIjQkY4MTJEIgpjb29sIDwtICIjODBDREMxIgpjb2xkIDwtICIjMDE2NjVFIgpncmFuaXRlIDwtICIjOWRhYmE5IgphbmRlc2l0ZSA8LSAiIzM4MmRiZiIKYmFzYWx0IDwtICIjYmYzODJkIgoKIyBwbG90IGZ4CmJveHBsb3QuZnggPC0gZnVuY3Rpb24oZGYsIHZhciwgeWVhciwgdHlwZSwgdG9wc29pbCA9IEZBTFNFLCBzdWJzb2lsID0gRkFMU0UpIHsKICBhdG0gPC0gaWZlbHNlKHllYXIgPT0gIjIwMDEiLCBhdG0uZDE0LjIwMDEsIGF0bS5kMTQuMjAxOSkKICBpZiAodHlwZSA9PSAiaW5jIikgewogICAgZGYgPC0gZGZbZGYkZDE0YyA+IC0yMDAsIF0KICAgIHlsaW0gPC0gYygtNjUsIDE2NSkKICB9IGVsc2UgewogICAgaWYgKHRvcHNvaWwpIHsKICAgICAgZGYgPC0gZGZbZGYkbHlyX2JvdCA8IDMxLCBdCiAgICAgIHlsaW0gPC0gYygtMTIwLCAxNjUpCiAgICAgIH0KICAgIGlmIChzdWJzb2lsKSB7CiAgICAgIGRmIDwtIGRmW2RmJGx5cl9ib3QgPiAzMSwgXQogICAgICB5bGltIDwtIGMoLTI3MCwgNjUpCiAgICB9CiAgfQogIGlmICh2YXIgPT0gIlBNIikgewogICAgZGYgJT4lCiAgICAgIG11dGF0ZShwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkdSIiwgImdyYW5pdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAiYmFzYWx0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZ3Jhbml0ZSIsICJhbmRlc2l0ZSIsICJiYXNhbHQiKSkpICU+JQogICAgICBncm91cF9ieShwbSwgbHlyX2JvdCkgJT4lCiAgICAgIGdncGxvdCguLCBhZXMocG0sIGQxNGMpKSArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGF0bSwgbGluZXR5cGUgPSAiZG90dGVkIiwgYWxwaGEgPSAwLjMpICsKICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgICBnZW9tX2JveHBsb3QoYWVzKGNvbG9yID0gcG0pLCBsd2QgPSAxKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpICsKICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IHlsaW0pICsKICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhseXJfYm90KSkgKwogICAgICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICBnZ3RpdGxlKHBhc3RlKHllYXIsIHR5cGUpKSArCiAgICAgIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCiAgfSBlbHNlIHsKICAgIGRmICU+JQogICAgICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSkpICU+JQogICAgICBncm91cF9ieShlY28sIGx5cl9ib3QpICU+JQogICAgICBnZ3Bsb3QoLiwgYWVzKGVjbywgZDE0YykpICsKICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYSA9IDAuMykgKwogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgICAgIGdlb21fYm94cGxvdChhZXMoY29sb3IgPSBlY28pLCBsd2QgPSAxKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJ3YXJtIiA9IHdhcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IGNvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IGNvbGQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpICsKICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IHlsaW0pICsKICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhseXJfYm90KSkgKwogICAgICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICBnZ3RpdGxlKHBhc3RlKHllYXIsIHR5cGUpKSArCiAgICAgIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCiAgfQp9CgojIGJ1bGsKYm94cGxvdC5meChzcmEuMjAwMS5idWxrLmRmLCAiUE0iLCAiMjAwMSIsICJidWxrIiwgdG9wc29pbCA9IFRSVUUpCmJveHBsb3QuZngoc3JhLjIwMTkuYnVsay5kZiwgIlBNIiwgIjIwMTkiLCAiYnVsayIsIHRvcHNvaWwgPSBUUlVFKQpib3hwbG90LmZ4KHNyYS4yMDAxLmJ1bGsuZGYsICJFQ08iLCAiMjAwMSIsICJidWxrIiwgdG9wc29pbCA9IFRSVUUpCmJveHBsb3QuZngoc3JhLjIwMTkuYnVsay5kZiwgIkVDTyIsICIyMDE5IiwgImJ1bGsiLCB0b3Bzb2lsID0gVFJVRSkKYm94cGxvdC5meChzcmEuMjAxOS5idWxrLmRmLCAiRUNPIiwgIjIwMTkiLCAiYnVsayIsIHN1YnNvaWwgPSBUUlVFKQojIGluYwpib3hwbG90LmZ4KHNyYS4yMDAxLmluYy5kZjIsICJQTSIsICIyMDAxIiwgImluYyIpCmJveHBsb3QuZngoc3JhLjIwMTkuaW5jLmRmMiwgIlBNIiwgIjIwMTkiLCAiaW5jIikKYm94cGxvdC5meChzcmEuMjAwMS5pbmMuZGYyLCAiRUNPIiwgIjIwMDEiLCAiaW5jIikKYm94cGxvdC5meChzcmEuMjAxOS5pbmMuZGYyLCAiRUNPIiwgIjIwMTkiLCAiaW5jIikKYGBgCgpgYGB7ciBkZWx0YS1kZWx0YS1wbG90c30KIyBkYXRhLCB1bnN1bW1hcml6ZWQKc3JhLnRzLmFsbC5yYXcgPC0gcmJpbmQoCiAgc3JhLjIwMDEuYnVsay5kZlsgLCBuYW1lcyhzcmEuMjAwMS5idWxrLmRmKSAlaW4lIG5hbWVzKHNyYS4yMDAxLmluYy5kZjIpXSwKICBzcmEuMjAxOS5idWxrLmRmWyAsIG5hbWVzKHNyYS4yMDE5LmJ1bGsuZGYpICVpbiUgbmFtZXMoc3JhLjIwMDEuaW5jLmRmMildLAogIHNyYS4yMDAxLmluYy5kZjIsCiAgc3JhLjIwMTkuaW5jLmRmMlsgLCBuYW1lcyhzcmEuMjAxOS5pbmMuZGYyKSAlaW4lIG5hbWVzKHNyYS4yMDAxLmluYy5kZjIpXSkgJT4lCiAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBmYWN0b3IoaWZlbHNlKFBNID09ICJHUiIsICJncmFuaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwgImJhc2FsdCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImdyYW5pdGUiLCAiYW5kZXNpdGUiLCAiYmFzYWx0IikpLAogICAgICAgICBUeXBlID0gYyhyZXAoImJ1bGsiLCBsZW5ndGggPSBucm93KHNyYS4yMDAxLmJ1bGsuZGYpKSwKICAgICAgICAgICAgICAgICAgcmVwKCJidWxrIiwgbGVuZ3RoID0gbnJvdyhzcmEuMjAxOS5idWxrLmRmKSksCiAgICAgICAgICAgICAgICAgIHJlcCgiaW5jIiwgbGVuZ3RoID0gbnJvdyhzcmEuMjAwMS5pbmMuZGYyKSksCiAgICAgICAgICAgICAgICAgIHJlcCgiaW5jIiwgbGVuZ3RoID0gbnJvdyhzcmEuMjAxOS5pbmMuZGYyKSkpLAogICAgICAgICB5ZWFyID0gYyhyZXAoMjAwMSwgbGVuZ3RoID0gbnJvdyhzcmEuMjAwMS5idWxrLmRmKSksCiAgICAgICAgICAgICAgICAgIHJlcCgyMDE5LCBsZW5ndGggPSBucm93KHNyYS4yMDE5LmJ1bGsuZGYpKSwKICAgICAgICAgICAgICAgICAgcmVwKDIwMDEsIGxlbmd0aCA9IG5yb3coc3JhLjIwMDEuaW5jLmRmMikpLAogICAgICAgICAgICAgICAgICByZXAoMjAxOSwgbGVuZ3RoID0gbnJvdyhzcmEuMjAxOS5pbmMuZGYyKSkpKQoKIyBwbG90IGZ4CnRzLmdyb3VwUGxvdC5meCA8LSBmdW5jdGlvbihkZiwgeCwgeSkgewogIHF1b194IDwtIHN5bSh4KQogIHF1b195IDwtIHN5bSh5KQogIGlmICh4ID09ICJwbSIpIHsKICAgIHZhci5uYW1lIDwtICJQYXJlbnQgbWF0ZXJpYWwiCiAgICB2YXIudmFsdWVzIDwtIGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpIAogIH0gZWxzZSB7CiAgICB2YXIubmFtZSA8LSAiQ2xpbWF0ZSIKICAgIHZhci52YWx1ZXMgPC0gIGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gY29vbCwKICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gY29sZCkKICB9CiAgcGxvdC5kZiA8LSBkZiAlPiUKICAgIGZpbHRlcihkMTRjID4gLTIwMCkgJT4lCiAgICBmaWx0ZXIobHlyX2JvdCA8IDMxKSAlPiUKICAgIGdyb3VwX2J5KCEhIHF1b194LCBseXJfYm90LCBUeXBlLCB5ZWFyKSAlPiUKICAgIHN1bW1hcml6ZShhY3Jvc3MoZDE0YywgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKQogIGlmICh5ID09ICJkZDE0YyIpIHsKICAgIHBsb3QuZGYgPC0gcGxvdC5kZiAlPiUKICAgICAgbXV0YXRlKGF0bSA9IGlmZWxzZSh5ZWFyID09IDIwMDEsIGF0bS5kMTQuMjAwMSwgYXRtLmQxNC4yMDE5KSwKICAgICAgICAgICAgIGRkMTRjID0gZDE0Y19tZWFuIC0gYXRtLAogICAgICAgICAgICAgdSA9IGQxNGNfbWVhbiArIGQxNGNfc2QgLSBhdG0sCiAgICAgICAgICAgICBsID0gZDE0Y19tZWFuIC0gZDE0Y19zZCAtIGF0bSkKICAgIGF0bS5kZiA8LSBhdG0uMTRjCiAgICBhdG0uZGYkZDE0YyA8LSAwCiAgICB5bGFiIDwtIGV4cHJlc3Npb24oRGVsdGEqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSAKICAgIH0gZWxzZSB7CiAgICAgIHBsb3QuZGYgPC0gcGxvdC5kZiAlPiUKICAgICAgICBtdXRhdGUodSA9IGQxNGNfbWVhbiArIGQxNGNfc2QsCiAgICAgICAgICAgICAgIGwgPSBkMTRjX21lYW4gLSBkMTRjX3NkKQogICAgICBhdG0uZGYgPC0gYXRtLjE0YwogICAgICB5bGFiIDwtIGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSAKICAgIH0KICAgIGdncGxvdChwbG90LmRmLCBhZXMoeWVhciwgISEgcXVvX3kpKSArCiAgICBnZW9tX3BhdGgoZGF0YSA9IGF0bS5kZiwgYWVzKHllYXIsIGQxNGMpKSArCiAgICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gISEgcXVvX3gsIGxpbmV0eXBlID0gVHlwZSksIGFscGhhID0gLjUsIGx3ZCA9IDEpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gISEgcXVvX3gpLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogICAgZ2VvbV9lcnJvcmJhcigKICAgICAgYWVzKHltaW4gPSBsLAogICAgICAgICAgeW1heCA9IHUsCiAgICAgICAgICBjb2xvciA9ICEhIHF1b194LAogICAgICAgICAgYWxwaGEgPSBUeXBlKSwKICAgICAgd2lkdGggPSAxLAogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gdmFyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFyLnZhbHVlcykgKwogICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICLCsVNEIiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhci52YWx1ZXMpICsKICAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCJidWxrIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jIiA9IC41KSkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhseXJfYm90KSkgKwogICAgeWxhYih5bGFiKSArCiAgICB4bGFiKCJZZWFyIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQp9CiMgcGxvdAp0cy5ncm91cFBsb3QuZngoc3JhLnRzLmFsbC5yYXcsICJwbSIsICJkZDE0YyIpCnRzLmdyb3VwUGxvdC5meChzcmEudHMuYWxsLnJhdywgImVjbyIsICJkZDE0YyIpCnRzLmdyb3VwUGxvdC5meChzcmEudHMuYWxsLnJhdywgInBtIiwgImQxNGNfbWVhbiIpCnRzLmdyb3VwUGxvdC5meChzcmEudHMuYWxsLnJhdywgImVjbyIsICJkMTRjX21lYW4iKQpgYGAKIyMgSW5pdGlhbCBtb2RlbGluZwoKVGhlIGdvYWwgb2YgdGhpcyBtb2RlbGluZyBleGVyY2lzZSBpcyB0byBzZWUgaG93IHBhcmVudCBtYXRlcmlhbCBhbmQgY2xpbWF0ZS9lY29zeXN0ZW0gYWZmZWN0IGVzdGltYXRlcyBvZiBzb2lsIGNhcmJvbiBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzLiBCdWxrIHNvaWwgXjE0XkMgb2JzZXJ2YXRpb25zIGZyb20gMjAwMSwgMjAwOSwgYW5kIDIwMTkgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgY2FyYm9uIG1vZGVscywgYXMgd2VsbCBhcyBvYnNlcnZhdGlvbnMgb2YgXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgb2Ygc29pbHMgY29sbGVjdGVkIGluIDIwMDEgYW5kIDIwMTkuIFByZXZpb3VzIHdvcmsgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBjYXJib24gc3RvY2tzIGF0IHRoZXNlIHNpdGVzIGlzIGxpa2VseSBhdCBlcXVpbGlicml1bSwgc28gd2Ugd2lsbCBhcHBseSB0aGUgc3RlYWR5LXN0YXRlIGFzc3VtcHRpb24gdG8gdGhlIG1vZGVsaW5nLgoKIyMjIFR3by1wb29sIG1vZGVscwoKT25lIHBvb2wgbW9kZWxzIGhhdmUgYmVlbiBzaG93biByZXBlYXRlZGx5IHRvIGJlIGluYWRlcXVhdGUgZm9yIGRlc2NyaWJpbmcgc29pbCBjYXJib24gZHluYW1pY3MuIEhvd2V2ZXIsIGFzIHNpbXBsZSBtb2RlbHMgYXJlIGVhc2llciB0byBjb25zdHJhaW4sIHdlIHdpbGwgc3RhcnQgd2l0aCBhIHR3by1wb29sIHBhcmFsbGVsIGFuZCB0d28tc2VyaWVzIG1vZGVscywgYXMgdGhlc2UgYXJlIHRoZSBzaW1wbGVzdCBtb2RlbCBzeXN0ZW0gYmV5b25kIHRoZSBzaW5nbGUgcG9vbCBhcHByb2FjaC4gCgpUaGUgdHdvLXBvb2wgcGFyYWxsZWwgbW9kZWwgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgoqIGRlY29tcG9zaXRpb24gY29uc3RhbnRzIGZvciBlYWNoIHBvb2wgKCprKn4xfiwgKmsqfjJ+KQoqIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAoJFxnYW1tYSQpCiogc3RlYWR5LXN0YXRlIGNhcmJvbiBzdG9ja3MgKEMpCiogaW5wdXRzIChJKQoqIGluaXRpYWwgdmFsdWVzIG9mIF4xNF5DCjEKVGhlIHR3by1wb29sIHNlcmllcyBtb2RlbCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiogZGVjb21wb3NpdGlvbiBjb25zdGFudHMgZm9yIGVhY2ggcG9vbCAoKmsqfjF+LCAqayp+Mn4pCiogdHJhbnNmZXIgY29lZmZpY2llbnQgKCRcYWxwaGEkKQoqIHN0ZWFkeS1zdGF0ZSBjYXJib24gc3RvY2tzIChDKQoqIGlucHV0cyAoSSkKKiBpbml0aWFsIHZhbHVlcyBvZiBeMTReQwoKRGVjb21wb3NpdGlvbiByYXRlcyAoKmsqKSBhcmUgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIF4xNF5DIGluIGEgcHJlLWJvbWIgc3lzdGVtIChmcmFjdGlvbiBtb2Rlcm4sICpGKikgYXQgc3RlYWR5LXN0YXRlIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb25zIChjZi4gU2NodXVyLCBEcnVmZmxlLCBhbmQgVHJ1bWJvcmUsIDIwMTYpOgo+KipFcS4gMSoqCgokJEYgPSBcZnJhY3trfXtrICsgXGxhbWJkYX0kJAo+KipFcS4gMioqCgokJGsgPSBcZnJhY3tcbGFtYmRhIFxjZG90IEZ9ezEgLSBGfSQkCj53aGVyZSAkXGxhbWJkYSQgaXMgdGhlIHJhZGlvYWN0aXZlIGRlY2F5IGNvbnN0YW50ICgxLzgyNjcpLgoKQXMgdGhlIGRlY29tcG9zaXRpb24gcmF0ZXMgd2lsbCB2YXJ5LCB0aGUgaW5pdGlhbCBeMTReQyBjb250ZW50IGNhbiBiZSBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IHdpdGggZXF1YXRpb24gMS4KCkNhcmJvbiBzdG9ja3MgYXJlIGtub3duLCB3aGlsZSBpbnB1dHMgd2lsbCBiZSBlc3RpbWF0ZWQgYW5kIGFyZSByZWxhdGVkIHRvIHRoZSBzdGVhZHktc3RhdGUgY29uZGl0aW9ucyBieSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiAKPioqRXEuIDMqKgoKJCRJID0gKGtfezF9IFxjZG90IENfezF9KSArIChrX3syfSBcY2RvdCBDX3syfSkkJAo+d2hlcmUgKkN+MX4qIGFuZCAqQ34yfiogYXJlIHRoZSBjYXJib24gc3RvY2tzIG9mIHRoZSB0d28gbW9kZWwgcG9vbHMuCgpCb3RoIHN0b2NrcyBhbmQgaW5wdXRzIGNhbiBiZSBzY2FsZWQgdG8gdGhlIGtub3duIHZhbHVlIG9mIHRoZSB0b3RhbCBjYXJib24gcG9vbCBvbmNlIHRoZSBzdGVhZHktc3RhdGUgcGFyYW1ldGVycyAoKmt+MX4qLCAqa34yfiosIGFuZCAkXGdhbW1hJCBvciAkXGFscGhhJCkgaGF2ZSBiZWVuIGRldGVybWluZWQuIFBvb2wgc2l6ZXMgYXJlIGEgZnVuY3Rpb24gb2YgdGhlIGlucHV0cyBhbmQgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IGF0IHN0ZWFkeS1zdGF0ZS4KCkEgTW9udGUtQ2FybG8gTWFya292IGNoYWluIGFwcHJvYWNoIHdpbGwgYmUgdXNlZCBmb3IgcGFyYW1ldGVyIGVzdGltYXRpb24gaW4gY29tYmluYXRpb24gd2l0aCBhbiBpbml0aWFsIG9wdGltaXphdGlvbiBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IHNldCBvZiBpbml0aWFsIHBhcmFtZXRlcnMuCgojIyBXb3JrZmxvdwoKSW5pdGlhbCBtb2RlbCBmaXR0aW5nIHdhcyBwZXJmb3JtZWQgZm9yIGJvdGggbW9kZWwgc3RydWN0dXJlcyB1c2luZyBnZW5lcm91cyBwYXJhbWV0ZXIgcmFuZ2VzIFswLCAxXSBmb3IgYWxsIHRocmVlIHBhcmFtZXRlcnMgKCprfjF+KiwgKmt+Mn4qLCAkXGdhbW1hJCBvciAkXGFscGhhJCkuIFRoZSBpbml0aWFsIHBhcmFtZXRlciBzZXQgd2FzIGZvdW5kIGJ5IGZpdHRpbmcgdGhlIG1vZGVscyBieSBleWUsIGZvbGxvd2VkIGJ5IG9wdGltaXphdGlvbiB3aXRoIHRoZSBmdW5jdGlvbiAibW9kRml0IiAoUiBwYWNrYWdlIEZNRSksIHVzaW5nIHRoZSBOZWxkZXItTWVhZCBhbGdvcml0aG0uIFRoZSBiZXN0IHNldCBvZiBwYXJhbWV0ZXJzIGZvdW5kIGJ5IG1vZEZpdCB3YXMgdGhlbiB1c2VkIGFzIHRoZSBpbnB1dCB0byBhIE1vbnRlIENhcmxvIE1hcmtvdiBDaGFpbiAoTUNNQyksIHVzaW5nIHRoZSBmdW5jdGlvbiAibW9kTUNNQyIgKFIgcGFja2FnZSBGTUUpLiBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHRoZSBNQ01DIG9wdGltaXphdGlvbiB3YXMgc2V0IGF0IDUwMDAgaW50aWFsbHksIHdpdGggZGVsYXllZCByZWplY3Rpb24gZW1wbG95ZWQgdG8gaW5jcmVhc2UgZWZmaWNpZW5jeS4gCgpUaGUgc3VtIG9mIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgZm9yIHRoZSBiZXN0IHBhcmFtZXRlciBzZXQgd2FzIHNsaWdodGx5IGxvd2VyIGZvciB0aGUgcGFyYWxsZWwgc3RydWN0dXJlIHRoYW4gZm9yIHRoZSBzZXJpZXMgc3RydWN0dXJlLiBBZGRpdGlvbmFsbHksIHRoZSBvdmVyYWxsIG1lYW4gZXJyb3Igb2YgdGhlIHJlc2lkdWFscyB3YXMgYWxzbyBsb3dlciBmb3IgdGhlIHBhcmFsbGVsIHN0cnVjdHVyZSwgbW9kZXJhdGVseSBzbyBmb3IgdGhlIGJ1bGsgQyBvYnNlcnZhdGlvbnMgYnV0IHN1YnN0YW50aWFsbHkgc28gZm9yIHRoZSByZXNwaXJhdGlvbiBvYnNlcnZhdGlvbnMgKGluIGFuZGVzaXRlIGFuZCBncmFuaXRlIHNvaWxzIGluIHBhcnRpY3VsYXIpLgoKSG93ZXZlciwgdGhlc2UgaW5pdGlhbCBmaXRzIHlpZWxkZWQgdW5yZWFsaXN0aWMgcGFyYW1ldGVyIGVzdGltYXRlcyBmb3IgbXVsdGlwbGUgc2l0ZXMsIHBhcnRpY3VsYXJseSBhdCB0aGUgbG93ZXIgZGVwdGhzLiBBZGRpdGlvbmFsbHksIHRoZSBtb2RGaXQgb3V0cHV0IHNob3dlZCB2ZXJ5IGhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgcGFyYW1ldGVycyBmb3IgYm90aCBtb2RlbCBzdHJ1Y3R1cmVzIChzbGlnaHRseSBoaWdoZXIgZm9yIHRoZSB0d28tcG9vbCBzZXJpZXMgbW9kZWwpLiAKCmBgYHtyIG1vZC11dGlsc30KIyBrIGZyb20gZnJhY3Rpb24gbW9kZXJuCmsgPC0gZnVuY3Rpb24gKEZtKSB7CiAgKEZtICogbGFtYmRhKS8oMSAtIEZtKQp9CgojIGQxNEMgZnJvbSBmcmFjdGlvbiBtb2Rlcm4gCmZtXzE0YyA8LSBmdW5jdGlvbiAoZm0sIGRhdGUpIHsKICAoZm0gKiBleHAobGFtYmRhICogKDE5NTAgLSBkYXRlKSkgLSAxKSAqIDEwMDAKfQoKIyBwcmUtYm9tYiBmcmFjdGlvbiBtb2Rlcm4gZnJvbSBrIChzdGVhZHktc3RhdGUgYXNzdW1lZCkKZm0gPC0gZnVuY3Rpb24gKGspewogIGsvKGsgKyBsYW1iZGEpCn0KYGBgCgpgYGB7ciBtb2QtY29uc3RyYWludHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBJbmRpY2VzIGZvciBlYWNoIGRlcHRoIGluY3JlbWVudAppeC4xMCA8LSBzZXEoMSwgMjcsIDMpCml4LjIwIDwtIHNlcSgyLCAyNywgMykKaXguMzAgPC0gc2VxKDMsIDI3LCAzKQoKIyMgU09DIHN0b2NrcwojIHVzZSAyMDE5IFNPQyBzdG9ja3MgZm9yIHN0ZWFkeS1zdGF0ZSBlc3RpbWF0ZXMKY3NvYy4xOS4wXzMwLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjIwMTkuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBzdXBwcmVzc01lc3NhZ2VzKAogICAgICBkZiAlPiUKICAgICAgICBmaWx0ZXIobHlyX2JvdCA8IDMxICYgbHlyX2JvdCA+IDApICU+JQogICAgICAgIHNlbGVjdChQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCwgbHlyX3NvYykgJT4lCiAgICAgICAgZ3JvdXBfYnkoUE1lY28sIGx5cl90b3AsIGx5cl9ib3QpKQogICAgcmV0dXJuKGRhdGEuZnJhbWUoZGYpKQogIH0pCikKIyBjb252ZXJ0IHRvIDI3IGVsZW1lbnQgbGlzdApjc29jLjE5LjBfMzAubHMgPC0gc3BsaXQoY3NvYy4xOS4wXzMwLmRmLCBwYXN0ZTAoY3NvYy4xOS4wXzMwLmRmJFBNZWNvLCAiXyIsIGNzb2MuMTkuMF8zMC5kZiRseXJfdG9wLCAiLSIsIGNzb2MuMTkuMF8zMC5kZiRseXJfYm90KSkKCiMgYXZlcmFnZQpjc29jLjE5LjBfMzAgPC0gbGFwcGx5KGNzb2MuMTkuMF8zMC5scywgZnVuY3Rpb24oZGYpIHsKICBkYXRhLmZyYW1lKAogICAgZGYgJT4lCiAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICAgICAgc3VtbWFyaXplKGx5cl9zb2MgPSBtZWFuKGx5cl9zb2MpKSkKfSkKCiMgbWFrZSBpbnRvIG9icyBkYXRhIGZyYW1lIGZvciBtb2QuY29zdCBmeApvYnMuY1N0b2NrIDwtIGxhcHBseShjc29jLjE5LjBfMzAubHMsIGZ1bmN0aW9uKGRmKSB7CiAgcmV0dXJuKGRhdGEuZnJhbWUodGltZSA9IHJlcChjKDIwMDEuNSwgMjAwOS41LCAyMDE5LjUpLCBlYWNoID0gMyksIGNTdG9jayA9IHJlcChkZiRseXJfc29jLCAzKSkpCn0pCgojIyBJbnB1dHMKIyBpbml0aWFsIGlucHV0cyB3aWxsIGJlIHNldCBhdCA0JSBvZiB0aGUgbGF5ZXIgY2FyYm9uIHN0b2NrcyAoYXJiaXRyYXJ5KQppbi5pIDwtIGxhcHBseShjc29jLjE5LjBfMzAsIGZ1bmN0aW9uKHgpIC4wNCAqIHgkbHlyX3NvYykKIyBJbnB1dHMgd2lsbCBiZSBhZGp1c3RlZCBiYXNlZCBvbiB0aGUgZml0dGVkIHBhcmFtZXRlcnMgdG8gbWF0Y2ggbWVhc3VyZWQgc3RvY2tzIGxhdGVyCgojIyAxNEMgY29uc3RyYWludHMKIyBidWxrCm9icy5idWxrLjE0YyA8LSB1bmxpc3QoCiAgbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEucmVwLmxzKSwgZnVuY3Rpb24oaSkgewogICMgaW5kZXggYWxvbmcgZGVwdGggaW50ZXJ2YWxzIDAtMTAsIDEwLTIwLCAyMC0zMAogIGRlcHRoLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoMTozKSwgZnVuY3Rpb24oaikgewogICAgYyh1bmxpc3QobGFwcGx5KHNyYS4xOS4wMS5yZXAubHNbW2ldXSwgIltbIiwgaikpLAogICAgICBzcGxpdChzcGxpdChzcmEuMTkuMDEuMDksIHNyYS4xOS4wMS4wOSRQTWVjbylbW2ldXSwKICAgICAgICAgICAgc3BsaXQoc3JhLjE5LjAxLjA5LCBzcmEuMTkuMDEuMDkkUE1lY28pW1tpXV1bImx5cl9ib3QiXSlbW2pdXVsgLCAiZm0iXVsyXSwKICAgICAgdW5saXN0KHNwbGl0KHNyYS4yMDE5LmxzW1tpXV0sIHNyYS4yMDE5LmxzW1tpXV1bImx5cl9ib3QiXSlbW2pdXVsiZm0iXSkpCiAgfSkKICByZXBzMDEgPC0gbGVuZ3RoKHNyYS4xOS4wMS5yZXAubHNbW2ldXSkKICBkZXB0aC5kZnMgPC0gbGFwcGx5KGRlcHRoLmxzLCBmdW5jdGlvbihmbSkgewogICAgZGF0YS5mcmFtZSh0aW1lID0gYyhyZXAoMjAwMS41LCByZXBzMDEpLCAyMDA5LjUsIHJlcCgyMDE5LjUsIDMpKSwKICAgICAgICAgICAgICAgYnVsa0MgPSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0pKQogIH0pCiAgcmV0dXJuKGRlcHRoLmRmcykKfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQpuYW1lcyhvYnMuYnVsay4xNGMpIDwtIHBhc3RlMChyZXAoYygiQU4iLCAiQlMiLCAiR1IiKSwgZWFjaCA9IDkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoYygicHAiLCAicmYiLCAid2YiKSwgZWFjaCA9IDMsIHRpbWVzID0gMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChjKCJfMC0xMCIsICJfMTAtMjAiLCAiXzIwLTMwIiksIHRpbWVzID0gOSkpCiMgcmVzcGlyYXRpb24Kc3JhLjE5LjAxLmluYy5taW4ubWF4IDwtIHVubGlzdCgKICBsYXBwbHkoc2VxX2Fsb25nKDE6MyksIGZ1bmN0aW9uKGkpIHsKICAgIGxhcHBseSgKICAgICAgbWFwcGx5KG1lcmdlLAogICAgICAgICAgICAgbGFwcGx5KGxhcHBseShzcmEuMTkuMDEuaW5jLmxzLCAiW1siLCAyKSwgIltbIiwgaSksIAogICAgICAgICAgICAgbGFwcGx5KGxhcHBseShzcmEuMTkuMDEuaW5jLmxzLCAiW1siLCAzKSwgIltbIiwgaSksCiAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSwKICAgICAgZnVuY3Rpb24oZGYpIHsKICAgICAgICBkYXRhLmZyYW1lKHRpbWUgPSAyMDAxLjUsIHJlc3AgPSBjKGRmJHgsIGRmJHkpKQogICAgICB9KQogIH0pLCByZWN1cnNpdmUgPSBGQUxTRSkKbmFtZXMoc3JhLjE5LjAxLmluYy5taW4ubWF4KSA8LSBwYXN0ZTAobmFtZXMoc3JhLjE5LjAxLmluYy5taW4ubWF4KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChjKCJfMC0xMCIsICJfMTAtMjAiLCAiXzIwLTMwIiksIGVhY2ggPSA5KSkKc3JhLjE5LjAxLmluYy5taW4ubWF4IDwtIGxhcHBseShzcmEuMTkuMDEuaW5jLm1pbi5tYXgsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkcmVzcCA8LSBjYWxjXzE0YyhkZiRyZXNwLCAyMDAxKQogIHJldHVybihkZikKfSkKCnNyYS4yMDE5LmluYy5taW4ubWF4IDwtIHVubGlzdChsYXBwbHkoc3JhLjIwMTkuaW5jLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHgkcmVzcCA8LSB4JGQxNGMKICAgIHgkdGltZSA8LSB4JFllYXIgKyAuNQogICAgcmV0dXJuKHhbICwgYygidGltZSIsICJyZXNwIildKQogIH0pCn0pLCByZWN1cnNpdmUgPSBGQUxTRSkKbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpIDwtIGdzdWIoIlxcLiIsICJfIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpKQpmb3IgKGkgaW4gc2VxX2Fsb25nKG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KSkpIHsKICBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heClbaV0gPC0gaWZlbHNlKGdyZXBsKCIxMCIsIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiMTAiLCAiMC0xMCIsIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIyMCIsIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIjIwIiwgIjEwLTIwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwgZ3N1YigiMzAiLCAiMjAtMzAiLCBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heClbaV0pKSkKfQoKb2JzLnJlc3AuMTRjIDwtIHJiaW5kKGJpbmRfcm93cyhzcmEuMTkuMDEuaW5jLm1pbi5tYXgsIC5pZCA9ICJpZCIpLAogICAgICAgICAgICAgICAgICAgICAgYmluZF9yb3dzKHNyYS4yMDE5LmluYy5taW4ubWF4LCAuaWQgPSAiaWQiKSkKb2JzLnJlc3AuMTRjIDwtIGxhcHBseShzcGxpdChvYnMucmVzcC4xNGMsIG9icy5yZXNwLjE0YyRpZCksIGZ1bmN0aW9uKGRmKSBkZlsgLCAyOjNdKQoKIyMgaW5wdXQvc3RvY2sgcmF0aW8KcmFzMDYgPC0gZGF0YS5mcmFtZShyZWFkX2V4Y2VsKCIuLi9kYXRhL2V4dGVybmFsL3NyYV9yYXNfaW5jL1Jlc3BSYXRlc19SYXNtdXNzZW4yMDA2Lnhsc3giLCBzaGVldCA9ICJSYXRlc1N1bSIpKQojIE9icyBjb3N0Cm9icy5mbHguc3RvY2sgPC0gbGFwcGx5KHNwbGl0KHJhczA2LCByYXMwNiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICBkYXRhLmZyYW1lKHRpbWUgPSAyMDAxLjUsICMgYXJiaXRyYXJ5CiAgICAgICAgICAgICBmbHguc3RvY2sgPSB4WyAsICJmbHhfc3RvY2tfcmF0aW8iXSkKfSkKCiMgY2FsY3VsYXRlIGlucHV0cyB1c2luZyBmbHgvc3RvY2sgcmF0aW8KaW4uZmx4LnN0b2NrIDwtIGxhcHBseShzZXFfYWxvbmcob2JzLmZseC5zdG9jayksIGZ1bmN0aW9uKGkpIHsKICBvYnMuZmx4LnN0b2NrW1tpXV1bWyJmbHguc3RvY2siXV0vY3NvYy4xOS4wXzMwW2l4LjEwXVtbaV1dW1sibHlyX3NvYyJdXQp9KQoKIyBGbHV4IGVzdGltYXRlZCBmcm9tIEdvdWxkZW4gZXQgYWwuIDIwMTI7IFRhbmcgZXQgYWwuIDIwMDU7IFdhbmcgZXQgYWwuIDIwMDA7IEdhdWRpbnNraSAyMDAwCiMgZmx1eGVzIGJ5IGVsZXZhdGlvbiBmcm9tIEdQUCByZXBvcnRlZCBpbiBHb3VsZGVuIGV0IGFsLiBGaWcuIDUgYW5kIGFwcHJveGltYXRlZAojIFJoIHBlcmNlbnRhZ2UgZnJvbSBUYW5nIGV0IGFsLiAyMDA1ID0gMC40NCAoYW5uLiBtZWFuIEJsb2RnZXR0KTsgY2YuIDAuNDggSGFydmFyZCBGb3Jlc3QKIyBBIGhvcml6b24gZXN0LiAwLjU1IGZyb20gR2F1ZGluc2tpCiMgYXNzdW1pbmcgQSA9IDAtMzAsIGFzc3VtZSAwLTEwID0gNTAlLCAxMC0yMCA9IDMwJSwgMjAtMzAgPSAyMCUgb2YgdG90YWwgQSBwcm9kdWN0aW9uIApoem5BLlJoLmtnbTIgPC0gMC40NCAqIDAuNTUgKiAxMF4tMwpncHAubHMgPC0gYygxODAwLCAxNjAwLCAxNDAwKQppbi5mcmMubHMgPC0gYygwLjUsIDAuMywgMC4yKQoKIyBmeCBmb3IgY2FsY3VsYXRpbmcgaW5wdXRzCmluLmZseC5meCA8LSBmdW5jdGlvbihQTWVjb19kZXB0aCkgewogIGdwcCA8LSBpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY29fZGVwdGgpLCBncHAubHNbMV0sIGlmZWxzZShncmVwbCgid2YiLCBQTWVjb19kZXB0aCksIGdwcC5sc1syXSwgZ3BwLmxzWzNdKSkKICBpbi5mcmMgPC0gaWZlbHNlKGdyZXBsKCIwLTEwIiwgUE1lY29fZGVwdGgpLCBpbi5mcmMubHNbMV0sIGlmZWxzZShncmVwbCgiMTAtMjAiLCBQTWVjb19kZXB0aCksIGluLmZyYy5sc1syXSwgaW4uZnJjLmxzWzNdKSkKICByZXR1cm4oZ3BwICogaW4uZnJjICogaHpuQS5SaC5rZ20yKQp9CgojIGlucHV0IGxpc3QKaW4uZXN0IDwtIGxhcHBseShzZXFfYWxvbmcob2JzLmNTdG9jayksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhvYnMuY1N0b2NrKVtpXQogIHJldHVybihpbi5mbHguZngoUE1lY29fZGVwdGgpKQp9KQpuYW1lcyhpbi5lc3QpIDwtIG5hbWVzKG9icy5jU3RvY2spCmBgYAoKYGBge3IgbW9kLWZ1bnMtZ2VufQojIGluZGV4IG9mIHllYXJzIGZvciB3aGljaCBidWxrL3Jlc3AgMTRDIGFyZSBrbm93bgp5ZWFyLml4IDwtIGMod2hpY2goRGF0bSREYXRlID09IDIwMDEuNSksCiAgICAgICAgICAgICB3aGljaChEYXRtJERhdGUgPT0gMjAwOS41KSwKICAgICAgICAgICAgIHdoaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpKQoKIyBmdW5jdGlvbiBmb3Igc2F2aW5nIGNvbnN0cmFpbnQgZGF0YSBpbiBhIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgaW4gZ2dwbG90Jwpjb24uZGYuZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgpIHsKICBidWxrLmRmIDwtIG9icy5idWxrLjE0Y1tbUE1lY29fZGVwdGhdXQogIHJlc3AuZGYgPC0gb2JzLnJlc3AuMTRjW1tQTWVjb19kZXB0aF1dCiAgcmV0dXJuKAogICAgY29uLmRmIDwtIGRhdGEuZnJhbWUocG9vbCA9IGMocmVwKCJidWxrIEMiLCBucm93KGJ1bGsuZGYpKSwgcmVwKCJyZXNwaXJhdGlvbiIsIG5yb3cocmVzcC5kZikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGQxNGMgPSBjKGJ1bGsuZGYkYnVsa0MsIHJlc3AuZGYkcmVzcCksCiAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYyhidWxrLmRmJHRpbWUsIHJlc3AuZGYkdGltZSkpKQp9CgojIHBsb3QgZnVuY3Rpb24KQzE0LjJwLnBsb3QuZnggPC0gZnVuY3Rpb24ocGxvdC5kZiwgY29uLmRmLCBtb2QsIFBNZWNvX2RlcHRoKSB7CiAgcGxvdC5kZiAlPiUKICBmaWx0ZXIocG9vbCA9PSAiYnVsayBDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIiB8IHBvb2wgPT0gImF0bSIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgZ2VvbV9wb2ludChkYXRhID0gY29uLmRmLCBhZXMoWWVhciwgZDE0YywgY29sb3IgPSBwb29sKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIlBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBnZ3RpdGxlKHBhc3RlKFBNZWNvX2RlcHRoLCBtb2QpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KQzE0LjFwLnBsb3QuZnggPC0gZnVuY3Rpb24ocGxvdC5kZiwgY29uLmRmLCBtb2QsIFBNZWNvX2RlcHRoKSB7CiAgZ2dwbG90KHBsb3QuZGYsIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSkgKwogIGdlb21fcGF0aCgpICsKICBnZW9tX3BvaW50KGRhdGEgPSBjb24uZGYsIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBvb2wpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiUG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgImJ1bGsgQyIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgZ2d0aXRsZShwYXN0ZShQTWVjb19kZXB0aCwgIiAxcCBidWxrICsgMXAgcmVzcCIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgc2V0IHVwIG1vZGVsIGZ1bmN0aW9uIGZvciBvcHRpbWl6YXRpb24KIyBOT1RFOiBwYXJbM10gZm9yIDJwcyBtb2RlbCBjaGFuZ2VkIHRvIHByb3BvcnRpb24gdHJhbnNmZXJyZWQgKG5vIGxvbmdlciA9IGEyMSkKIyB0aGVyZWZvcmUsIGEyMSA9IHBhclszXSAqIHBhclsxXQptb2RGdW5fMnAgPC0gZnVuY3Rpb24ocGFycywgSW4sIGxhZyA9IDAsIHBhc3MgPSBUUlVFLCBvdXQgPSAibW9kRml0IiwgbW9kKSB7CiAKICAjIGludGlhbCAxNEMKICBGMF9EZWx0YTE0QyA8LSB1bmxpc3QobGFwcGx5KHBhcnNbMToyXSwgZnVuY3Rpb24oeCkgRGVsdGExNENfZnJvbV9BYnNvbHV0ZUZyYWN0aW9uTW9kZXJuKGZtKHgpKSkpCiAgCiAgIyBtb2RlbCBtYXRyaXgKICBBIDwtIC1kaWFnKHBhcnNbMToyXSkKICBpZiAobW9kID09ICIycHMiKSB7CiAgICBhMjEgPC0gcGFyc1szXSAqIHBhcnNbMV0KICAgIEFbMiwgMV0gPC0gYTIxCiAgfQogICAgCiAgIyBzdGVhZHktc3RhdGUgQyBzdG9ja3MKICBpZiAobW9kID09ICIycHAiKSB7CiAgICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4gKiBwYXJzWzNdLCBJbiAqICgxIC0gcGFyc1szXSkpKQogIH0gZWxzZSB7CiAgICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4sIDApKQogIH0KICAKICAjIHRpbWUgaW5kZXgKICBpeC50IDwtIGMoKGxhZyArIDEpOm5yb3coRGF0bSkpCiAgCiAgIyBtb2RlbAogIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgIG1vZCA8LSBUd29wUGFyYWxsZWxNb2RlbDE0KHQgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IHBhcnNbMToyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhzcy5jc3RvY2tbMV0sIHNzLmNzdG9ja1syXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IEYwX0RlbHRhMTRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IHBhcnNbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZjID0gRGF0bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IGxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQogIH0gZWxzZSB7CiAgICBtb2QgPC0gVHdvcFNlcmllc01vZGVsMTQodCA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IHBhcnNbMToyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMCA9IGMoc3MuY3N0b2NrWzFdLCBzcy5jc3RvY2tbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMjEgPSBhMjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQogIH0KICAKICAjIGdldCBtb2QgdmFsdWVzCiAgQzE0bSA8LSBnZXRGMTRDKG1vZCkKICBDMTRwIDwtIGdldEYxNChtb2QpCiAgQzE0ciA8LSBnZXRGMTRSKG1vZCkKICBDdG90IDwtIGdldEMobW9kKQogIAogIGlmKG91dCA9PSAibW9kRml0IikgewogICAgIyBkYXRhZnJhbWUgZm9yIG1vZEZpdCBmeAogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHRpbWUgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgIGJ1bGtDID0gQzE0bSwgCiAgICAgIHJlc3AgPSBDMTRyLAogICAgICBjU3RvY2sgPSByb3dTdW1zKEN0b3QpKSkKICB9IGVsc2UgewogICAgIyBkYXRhIGZyYW1lIGZvciBwbG90dGluZwogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHllYXJzID0gcmVwKERhdG0kRGF0ZVtpeC50XSwgNSksCiAgICAgIGQxNEMgPSBjKEMxNHBbLDFdLCAKICAgICAgICAgICAgICAgQzE0cFssMl0sIAogICAgICAgICAgICAgICBDMTRtLAogICAgICAgICAgICAgICBDMTRyLAogICAgICAgICAgICAgICBEYXRtJE5IYzE0W2l4LnRdKSwKICAgICAgcG9vbCA9IHJlcChjKCJmYXN0IiwgInNsb3ciLCAiYnVsayBDIiwgInJlc3BpcmF0aW9uIiwgImF0bSIpLCBlYWNoID0gbnJvdyhDMTRwKSkpKQogIH0KfQoKIyAxcCBtb2RGdW4KbW9kRnVuXzFwIDwtIGZ1bmN0aW9uKHBhcnMsIEluLCBsYWcgPSAwLCBvdXQgPSAibW9kRml0IiwgbW9kLCBwYXNzID0gVFJVRSkgewogCiAgIyBpbnRpYWwgMTRDCiAgRjBfRGVsdGExNEMgPC0gRGVsdGExNENfZnJvbV9BYnNvbHV0ZUZyYWN0aW9uTW9kZXJuKGZtKHBhcnMpKQogIAogICMgc3RlYWR5LXN0YXRlIEMgc3RvY2tzCiAgc3MuY3N0b2NrIDwtIEluL3BhcnMKICAKICAjIHRpbWUgaW5kZXgKICBpeC50IDwtIGMoKGxhZyArIDEpOm5yb3coRGF0bSkpCiAgCiAgIyBtb2RlbAogIG1vZCA8LSBzdXBwcmVzc1dhcm5pbmdzKAogICAgIyB3YXJuaW5ncyBzdXBwcmVzc2VkIGR1ZSB0byB0aGUgIkZjIiB3YXJuaW5nCiAgICBPbmVwTW9kZWwxNCh0ID0gRGF0bSREYXRlW2l4LnRdLAogICAgICAgICAgICAgICAgICAgICBrID0gcGFycywKICAgICAgICAgICAgICAgICAgICAgQzAgPSBzcy5jc3RvY2ssCiAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgIEluID0gSW4sCiAgICAgICAgICAgICAgICAgICAgIGlucHV0RmMgPSBEYXRtLAogICAgICAgICAgICAgICAgICAgICBsYWcgPSBsYWcsCiAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQogICkKICAKICAjIGdldCBtb2QgdmFsdWVzCiAgQzE0bSA8LSBnZXRGMTRDKG1vZCkKICBDdG90IDwtIGdldEMobW9kKQogIAogIGlmKG91dCA9PSAibW9kRml0IikgewogICAgIyBkYXRhZnJhbWUgZm9yIG1vZEZpdCBmeAogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHRpbWUgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgIGJ1bGtDID0gQzE0bSwKICAgICAgY1N0b2NrID0gQ3RvdCkpCiAgfSBlbHNlIHsKICAgICMgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKICAgIHJldHVybihkYXRhLmZyYW1lKAogICAgICB5ZWFycyA9IHJlcChEYXRtJERhdGVbaXgudF0sIDEpLAogICAgICBkMTRDID0gYyhDMTRtLAogICAgICAgICAgICAgICBEYXRtJE5IYzE0W2l4LnRdKSwKICAgICAgcG9vbCA9IHJlcChjKCJidWxrIEMiLCAiYXRtIiksIGVhY2ggPSBsZW5ndGgoQzE0bSkpKSkKICB9Cn0KCiMgZnVuY3Rpb24gZm9yIHRyaWFsIGFuZCBlcnJvciBhcHByb2FjaCB0byBmaW5kaW5nIGluaXRpYWwgcGFyYW1ldGVyIHNldApwYXIuZnggPC0gZnVuY3Rpb24ocGFycywgSW4sIGxhZyA9IDAsIG91dCA9ICJwbG90LmRmIiwgdmVyYm9zZSA9IFRSVUUsIG1vZCwgcGFzcyA9IEZBTFNFKSB7CiAgCiAgIyBtb2RlbCBtYXRyaXgKICBBIDwtIC1kaWFnKHBhcnNbMToyXSkKICBpZiAobW9kID09ICIycHMiKSB7CiAgICBhMjEgPC0gcGFyc1szXSAqIHBhcnNbMV0KICAgIEFbMiwgMV0gPC0gYTIxCiAgICAjIHN0ZWFkeS1zdGF0ZSBzdG9ja3MKICAgIHNzLmNzdG9jayA8LSByb3VuZCgoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiwgMCkpLCAxKQogIH0gZWxzZSBpZiAobW9kID09ICIycHAiKSB7CiAgICAjIHN0ZWFkeS1zdGF0ZSBzdG9ja3MKICAgIHNzLmNzdG9jayA8LSByb3VuZCgoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiAqIHBhcnNbM10sIEluICogKDEgLSBwYXJzWzNdKSkpLCAxKQogIH0gZWxzZSB7CiAgICBzcy5jc3RvY2sgPC0gSW4vcGFycwogIH0KICAKICBjc3RvY2suc3VtIDwtIGlmZWxzZShsZW5ndGgoc3MuY3N0b2NrKSA9PSAxLCBzcy5jc3RvY2ssIGNvbFN1bXMoc3MuY3N0b2NrKSkKICAKICAjIHByaW50IHNpdGUgYW5kIHN0ZWFkeS1zdGF0ZSBzdG9ja3MKICBpZiAodmVyYm9zZSkgewogICAgY2F0KHBhc3RlMChQTWVjb19kZXB0aCwgIlxuIikpCiAgICBpZiAobW9kID09ICIycHMiIHwgbW9kID09ICIycHAiKSB7CiAgICAgIGNhdChwYXN0ZTAoc3MuY3N0b2NrWzFdLCAiIChmYXN0IHBvb2wpXG4iLCBzcy5jc3RvY2tbMl0sICIgKHNsb3cgcG9vbClcbiIpKQogICAgICBjYXQocGFzdGUwKCJzbG93IHBvb2w6ICIsIHJvdW5kKHNzLmNzdG9ja1syXSAvIGNzdG9jay5zdW0gKiAxMDAsIDApLCAiJVxuIikpIAogICAgfQogICAgY2F0KHJvdW5kKGNzdG9jay5zdW0sIDEpLCAiIChtb2RlbGVkIHN0b2NrcylcbiIpCiAgICBjYXQocm91bmQoY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsICJseXJfc29jIl0sIDEpLCAiIChtZWFzdXJlZCBzdG9ja3MpXG4iKSAKICB9CiAgaWYgKG1vZCA9PSAiMXAiKSB7CiAgICByZXR1cm4obW9kRnVuXzFwKHBhcnMgPSBwYXJzLCBJbiA9IEluLCBsYWcgPSBsYWcsIG91dCA9IG91dCwgbW9kID0gIjFwIiwgcGFzcyA9IHBhc3MpKQogIH0KICBpZiAobW9kID09ICIycHAiKSB7CiAgIHJldHVybihtb2RGdW5fMnAocGFycyA9IHBhcnMsIEluID0gSW4sIGxhZyA9IGxhZywgb3V0ID0gb3V0LCBtb2QgPSAiMnBwIiwgcGFzcyA9IHBhc3MpKSAKICB9IGVsc2UgaWYgKG1vZCA9PSAiMnBzIikgewogICAgcmV0dXJuKG1vZEZ1bl8ycChwYXJzID0gcGFycywgSW4gPSBJbiwgbGFnID0gbGFnLCBvdXQgPSBvdXQsIG1vZCA9ICIycHMiLCBwYXNzID0gcGFzcykpIAogIH0KfQpgYGAKCmBgYHtyIGlucHV0cy1zdG9ja3N9CiMjIGFkanVzdCBpbnB1dHMgdG8gbWF0Y2ggc3RvY2tzCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHN0ZWFkeS1zdGF0ZSBTT0Mgc3RvY2tzCnNvYy5meCA8LSBmdW5jdGlvbihtb2RTdHIsIHBhcnMsIEluLCBvdXQgPSAicG9vbHMiKSB7CiAgaWYgKG1vZFN0ciA9PSAiMnBwIikgewogICAgY21hdCA8LSAtMSAqIHNvbHZlKC1kaWFnKHBhcnNbMToyXSkpICUqJSBjKEluICogcGFyc1szXSwgSW4gKiAoMSAtIHBhcnNbM10pKQogIH0gZWxzZSB7CiAgICBBIDwtIC1kaWFnKHBhcnNbMToyXSkKICAgIEFbMiwgMV0gPC0gcGFyc1szXSAjIG5vdGUgdGhhdCBhMjEgZGVmaW5lZCBhcyBwY3QgdHJhbnNmZXIgKiBrMQogICAgY21hdCA8LSAtMSAqIHNvbHZlKEEpICUqJSBjKEluLCAwKSAjIEluIGlzIHRvdGFsIGlucHV0IGludG8gdGhlIHN5c3RlbQogIH0KICBpZiAob3V0ID09ICJwb29scyIpIHsKICAgIHJldHVybihjbWF0KQogIH0gZWxzZSB7CiAgICByZXR1cm4oY29sU3VtcyhjbWF0KSkKICB9Cn0KCmluLmZpdC5meCA8LSBmdW5jdGlvbihtb2RTdHIsIHBhcnMsIGluaXRpYWxJbiwgU09DKSB7CiAgIyBzZXF1ZW5jZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMKICBpZiAgKFNPQyA8IHNvYy5meChtb2RTdHIsIHBhcnMsIGluaXRpYWxJbiwgb3V0ID0gInN1bSIpKSB7CiAgICBpbnMgPC0gc2VxKC4wMSwgCiAgICAgICAgICAgICAgIGluaXRpYWxJbiwgCiAgICAgICAgICAgICAgIC4wMSkKICAgIH0gZWxzZSB7CiAgICAgIGlucyA8LSBzZXEoaW5pdGlhbEluLCAKICAgICAgICAgICAgICAgICBTT0MsIAogICAgICAgICAgICAgICAgIC4wMSkKICAgIH0KICAjIG1vZGVsZWQgc3RvY2tzCiAgc29jX21vZCA8LSBsYXBwbHkoc2VxX2Fsb25nKGlucyksIGZ1bmN0aW9uKGopIHsKICAgIHNvYy5meChtb2RTdHIsIHBhcnMsIGluc1tqXSwgb3V0ID0gInN1bSIpCiAgfSkKICBpeCA8LSB3aGljaC5taW4oYWJzKHVubGlzdChzb2NfbW9kKSAtIFNPQykpCiAgcmV0dXJuKGluc1tpeF0pCn0KCiMgbG9hZCBpbml0aWFsIHBhcmFtZXRlciBzZXQKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHBfMjAyMS0wMy0zMC5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBzXzIwMjAtMTEtMTYuUmRhdGEiKQoKIyMgaW5wdXRzIGZvciBpbml0aWFsIHBhciBzZXQgYW5kIG1lYXN1cmVkIHN0b2NrcwojIDJwcAppbi5tZWFzLjJwcCA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuaS4ycHBbaXguMTBdKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuaS4ycHBbaXguMTBdKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBwIiwgcGFycy5pLjJwcFtpeC4xMF1bW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4ubWVhcy4ycHApIDwtIG5hbWVzKHBhcnMuaS4ycHBbaXguMTBdKQojIDJwcwppbi5tZWFzLjJwcyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuaS4ycHNbaXguMTBdKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuaS4ycHNbaXguMTBdKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBwIiwgcGFycy5pLjJwc1tpeC4xMF1bW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4ubWVhcy4ycHMpIDwtIG5hbWVzKHBhcnMuaS4ycHNbaXguMTBdKQoKIyBGbHV4IGVzdGltYXRlZCBmcm9tIEdvdWxkZW4gZXQgYWwuIDIwMTI7IFRhbmcgZXQgYWwuIDIwMDU7IFdhbmcgZXQgYWwuIDIwMDA7IEdhdWRpbnNraSAyMDAwCiMgZmx1eGVzIGJ5IGVsZXZhdGlvbiBmcm9tIEdQUCByZXBvcnRlZCBpbiBHb3VsZGVuIGV0IGFsLiBGaWcuIDUgYW5kIGFwcHJveGltYXRlZAojIFJoIHBlcmNlbnRhZ2UgZnJvbSBUYW5nIGV0IGFsLiAyMDA1ID0gMC40NCAoYW5uLiBtZWFuIEJsb2RnZXR0KTsgY2YuIDAuNDggSGFydmFyZCBGb3Jlc3QKIyBBIGhvcml6b24gZXN0LiAwLjU1IGZyb20gR2F1ZGluc2tpCiMgYXNzdW1pbmcgQSA9IDAtMzAsIGFzc3VtZSAwLTEwID0gNTAlLCAxMC0yMCA9IDMwJSwgMjAtMzAgPSAyMCUgb2YgdG90YWwgQSBwcm9kdWN0aW9uIApoem5BLlJoLmtnbTIgPC0gMC40NCAqIDAuNTUgKiAxMF4tMwpncHAubHMgPC0gYygxODAwLCAxNjAwLCAxNDAwKQppbi5mcmMubHMgPC0gYygwLjUsIDAuMywgMC4yKQoKIyBmeCBmb3IgY2FsY3VsYXRpbmcgaW5wdXRzCmluLmZseC5meCA8LSBmdW5jdGlvbihQTWVjb19kZXB0aCkgewogIGdwcCA8LSBpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY29fZGVwdGgpLCBncHAubHNbMV0sIGlmZWxzZShncmVwbCgid2YiLCBQTWVjb19kZXB0aCksIGdwcC5sc1syXSwgZ3BwLmxzWzNdKSkKICBpbi5mcmMgPC0gaWZlbHNlKGdyZXBsKCIwLTEwIiwgUE1lY29fZGVwdGgpLCBpbi5mcmMubHNbMV0sIGlmZWxzZShncmVwbCgiMTAtMjAiLCBQTWVjb19kZXB0aCksIGluLmZyYy5sc1syXSwgaW4uZnJjLmxzWzNdKSkKICByZXR1cm4oZ3BwICogaW4uZnJjICogaHpuQS5SaC5rZ20yKQp9CgojIGlucHV0IGxpc3QKaW4uZXN0IDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5pLjJwcCksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpXQogIHJldHVybihpbi5mbHguZngoUE1lY29fZGVwdGgpKQp9KQpuYW1lcyhpbi5lc3QpIDwtIG5hbWVzKHBhcnMuaS4ycHApCmBgYAojIyBQYXJhbWV0ZXIgb3B0aW1pemF0aW9uCgpPcHRpbWl6aW5nIHRoZSBwYXJhbWV0ZXIgc2V0IHJlcXVpcmVzIGltcG9zaW5nIGNvc3RzIGFuZCBvcHRpb25hbGx5IGNvbnN0cmFpbmluZyB0aGUgYWxsb3dhYmxlIHJhbmdlIG9mIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIuIEdpdmVuIHRoYXQgd2Ugb25seSBoYXZlIGRhdGEgZm9yIHRocmVlIHRpbWUgcG9pbnRzLCB0aGlzIGlzIGEgcmVsYXRpdmVseSBzcGFyc2UgZGF0YSBzZXQgZm9yIGNvbnN0cmFpbmluZyB0aGVzZSBtb2RlbHMuIEFjY29yZGluZ2x5LCB0aGUgb3B0aW1pemF0aW9uIHByb2NlZHVyZSB3aWxsIGJlbmVmaXQgZnJvbSAqYSBwcmlvcmkqIGNvbnN0cmFpbnRzIG9mIHRoZSBhbGxvd2FibGUgcGFyYW1ldGVyIHJhbmdlcy4gRm9yIGV4YW1wbGUsIHNpbmNlIHdlIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gY2Fubm90IGJlIGFkZXF1YXRlbHkgbW9kZWxlZCBhcyBhIHNpbmdsZSBob21vZ2Vub3VzIHJlc2Vydm9pciwgd2Ugd2lsbCBlbnN1cmUgdGhhdCB0aGUgb3B0aW1pemF0aW9uIHByb2NlZHVyZSBjYW5ub3QgY29sbGFwc2UgdGhlIHR3by1wb29sIHN5c3RlbSBpbnRvIGEgc2luZ2xlIHBvb2wuIFRoaXMgY2FuIGJlIG1pdGlnYXRlZCBpbiB0aGUgdHdvLXBvb2wgcGFyYWxsZWwgb3B0aW1pemF0aW9uIGJ5IGNvbnN0cmFpbmluZyAkXGdhbW1hJCAoaS5lLiB0aGUgcGVyY2VudGFnZSBvZiB0aGUgaW5wdXRzIGVudGVyaW5nIHRoZSBmYXN0IHBvb2wpIHRvIGEgcmFuZ2Ugb2YgNTAlIHRvIDk1JS4gU2ltaWxhcmx5LCBmb3IgdGhlIHR3by1wb29sIHNlcmllcyBtb2RlbCBzdHJ1Y3R1cmUgd2UgY2FuIGNvbnN0cmFpbiB0aGUgcmFuZ2Ugb2YgdGhlIHRyYW5zZmVyIGNvZWZmaWNpZW50IHRvIGJlIGJldHdlZW4gMC4wIGFuZCAwLjEsIGVuc3VyaW5nIHRoYXQgc29tZSBjYXJib24gcmVtYWlucyBpbiB0aGUgZmFzdCBjeWNsaW5nIHBvb2wuCgpBZGRpdGlvbmFsbHksIHRvIGVuZm9yY2UgYSByZWxhdGl2ZWx5IGZhc3QgY3ljbGluZyBwb29sIGFuZCByZWxhdGl2ZWx5IHNsb3dlciBjeWNsaW5nIHBvb2wsIHdlIHdpbGwgbG9vc2VseSBjb25zdHJhaW4gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGVzIGFzIHdlbGwgKGJvdGggbW9kZWwgc3RydWN0dXJlcyk6Cgoqa34xfio6IFswLjAyLCAxLjAwXSAoNTAgdG8gMSB5ZWFyKQoqa34yfio6IFswLjAwMDEsIDAuMDJdICgxMCwwMDAgdG8gNTAgeWVhcnMpCgpGaW5hbGx5LCB0aGUgbW9kZWxzIHdpbGwgYmUgcnVuIHRvIGVuZm9yY2Ugc3RlYWR5LXN0YXRlLCBpLmUuIHdpdGggdW52YXJ5aW5nIGNhcmJvbiBzdG9ja3MuIFRoZSBhbW91bnQgb2YgY2FyYm9uIG9ic2VydmVkIGluIHRoZSBzeXN0ZW0gd2lsbCBiZSB1c2VkIGluIHRoZSBjb3N0IGZ1bmN0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSByYWRpb2NhcmJvbiBvYnNlcnZhdGlvbnMgbWFkZSBpbiAyMDAxLCAyMDA5LCBhbmQgMjAxOS4gVGhlIGlucHV0cyB3aWxsIGJlIGVzdGltYXRlZCBmcm9tIG5ldCBlY29zeXN0ZW0gZXhjaGFuZ2UgKE5FRSkgZGF0YSBtZWFzdXJlZCBhdCBuZWFyYnkgZWRkeSBjb3ZhcmlhbmNlIHNpdGVzOiBCbG9kZ2V0dCBleHBlcmltZW50YWwgZm9yZXN0IChBbWVyaUZsdXgpLCBMb3dlciBUZWFrZXR0bGUgKE5FT04pLCBhbmQgU29hcHJvb3QgU2FkZGxlIChORU9OKS4gQWx0ZXJuYXRpdmVseSwgdXNpbmcgY29ycmVsYXRpb25zIGJldHdlZW4gZmx1eGVzIG1lYXN1cmVkIGZyb20gdGhlc2UgZWRkeSBjb3ZhcmlhbmNlIHRvd2VycyBhbmQgR1BQIGVzdGltYXRlZCBmcm9tIHNhdGVsbGl0ZSByZXRyaWV2YWxzIG9mIFNJRiwgZXN0aW1hdGVzIGNhbiBiZSBtYWRlIGZvciBpbnB1dHMgYXQgdGhlIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggc2l0ZSBsb2NhdGlvbi4KCmBgYHtyIG9wdC1tb2QsIGV2YWwgPSBGQUxTRX0KIyBOb3RlOiB0aGlzIG9ubHkgcnVucyBpZiBldmFsIGZsYWcgc3dpdGNoZWQgdG8gVFJVRQojIyBPcHRpbWl6ZSBtb2RlbCBwYXJzCiMgQ29zdCBmdW5jdGlvbiAoZXZhbHVhdGVzIGVycm9yIGFzIG1vZGVsIHZzLiBvYnN2LCBwZXIgRk1FIHJlcSkKIyBub3RlIHRoYXQgd2UgaGF2ZSB0byBzZXQgInBhc3MiIHRvIFRSVUUgc28gU29pbFIgbW9kZWwgZG9lc24ndCBmYWlsIChuZWcuIHJlc3ApCm1vZC5maXRzLmZ4IDwtIGZ1bmN0aW9uKG1vZCwgcGFycywgSW4sIHN1YiwgbGFnID0gMCwgdXBwZXIsIGxvd2VyLCBjb3N0KSB7CiAgCiAgIyBzdGFydCBsb29wCiAgbGFwcGx5KHNlcV9hbG9uZyhwYXJzW3N1Yl0pLCBmdW5jdGlvbihpKSB7CiAgICAKICAgICMgc3RhcnQgdGltZXIgYW5kIHByaW50IFBNZWNvX2RlcHRoCiAgICBzdGFydCA8LSBTeXMudGltZSgpCiAgICBjYXQocGFzdGUwKG5hbWVzKHBhcnMpW3N1Yl1baV0sICIgcGFyYW1ldGVyIGZpdHRpbmdcbiIpKQogIAogICAgIyBkZWZpbmUgcGFycwogICAgcGFycyA8LSBwYXJzW3N1Yl1bW2ldXQogICAgaWYgKG1vZCA9PSAiMnBwIikgewogICAgICBuYW1lcyhwYXJzKSA8LSBjKCJrMSIsICJrMiIsICJnYW0iKQogICAgfSBlbHNlIHsKICAgICAgbmFtZXMocGFycykgPC0gYygiazEiLCAiazIiLCAidGMiKQogICAgfQogICAgCiAgICAjIFNldCBpbnB1dAogICAgSW4gPC0gSW5bc3ViXVtbaV1dCiAgICAKICAgICMgZGVmaW5lIGNvc3QgZnVuY3Rpb24KICAgIGlmIChjb3N0ID09ICIxNEMgKyBjU3RvY2siKSB7CiAgICAgIG1vZC5Db3N0IDwtIGZ1bmN0aW9uKHBhcnMpIHsKICAgICAgICBtb2RlbE91dHB1dCA8LSBtb2RGdW5fMnAocGFycywgSW4sIG1vZCA9IG1vZCwgbGFnID0gbGFnKQogICAgICAgIGNvc3QxIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmJ1bGsuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFKQogICAgICAgIGNvc3QyIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFLCBjb3N0ID0gY29zdDEpIAogICAgICAgIHJldHVybihtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5jU3RvY2tbc3ViXVtbaV1dLCBjb3N0ID0gY29zdDIpKQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvc3QgPT0gIjE0QyArIHN0b2NrL2ZseCIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kLCBsYWcgPSBsYWcpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgY29zdDIgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcC4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUsIGNvc3QgPSBjb3N0MSkgCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmZseC5zdG9ja1tbaV1dLCBjb3N0ID0gY29zdDIpKQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvc3QgPT0gIjE0QyIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kLCBsYWcgPSBsYWcpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFLCBjb3N0ID0gY29zdDEpKQogICAgICB9IAogICAgfSBlbHNlIGlmIChjb3N0ID09ICIxNEMgYnVsayArIGNTdG9jayIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kLCBsYWcgPSBsYWcpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmNTdG9ja1tzdWJdW1tpXV0sIGNvc3QgPSBjb3N0MSkpCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29zdCA9PSAiMTRDIGJ1bGsgb25seSIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kLCBsYWcgPSBsYWcpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmJ1bGsuMTRjW3N1Yl1bW2ldXSwgc2NhbGVWYXIgPSBUUlVFKSkKICAgICAgfQogICAgfQogICAgCiAgICAjIGZpdCBwYXJzCiAgICBmaXQgPC0gdHJ5Q2F0Y2goCiAgICAgIG1vZEZpdChmID0gbW9kLkNvc3QsCiAgICAgICAgICAgICBwID0gcGFycywKICAgICAgICAgICAgIG1ldGhvZCA9ICdOZWxkZXItTWVhZCcsCiAgICAgICAgICAgICB1cHBlciA9IHVwcGVyLCAKICAgICAgICAgICAgIGxvd2VyID0gbG93ZXIpLAogICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQogICAgCiAgICBTZnVuIDwtIHNlbnNGdW4obW9kLkNvc3QsIGZpdCRwYXIpCiAgICAKICAgICMgRW5kIHRpbWVyIGFuZCBwcmludCBlbGFwc2VkIHRpbWUKICAgIGVuZCA8LSBTeXMudGltZSgpCiAgICBjYXQocGFzdGUwKCJ0aW1lOiAiLCBlbmQgLSBzdGFydCwgIlxuIikpCiAgICAKICAgICMgUmV0dXJuIGZpdHRlZCBwYXJhbWV0ZXJzIGFuZCBzZW5zaXRpdml0eQogICAgcmV0dXJuKGxpc3QobW9kZml0ID0gZml0LCAKICAgICAgICAgICAgICAgIHNlbnMgPSBTZnVuKSkKICB9KSAKfQoKIyMgMnBwCiMgcGFyIHJhbmdlIFswLCAxXSBmb3IgYWxsIHBhcnMKbW9kLnNlbnMuZml0cy4ycHAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyBjb25zdHJhaW4gZ2FtbWEgdG8gWzAuNSwgMC45NV0KbW9kLnNlbnMuZml0cy4ycHAucDMuNS45NSA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAwLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwLjUpKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1LCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcC5wMy41Ljk1IiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcC5wMy41Ljk1IDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1LCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIDJwcDMgKHBhciByYW5nZSBjb25zdHJhaW50cywgaW5wdXRzIGZpdCB0byBtZWFzIHN0b2NrcykKbW9kLnNlbnMuZml0cy4ycHAzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4ubWVhcy4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBvbmx5IikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHAzKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDMsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwMyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAycHAzcyAocGFyIHJhbmdlIGNvbnN0cmFpbnRzLCBpbnB1dHMgZml0IHRvIG1lYXMgc3RvY2tzLCArIHN0b2NrIGNvbnN0cmFpbnQpCm1vZC5zZW5zLmZpdHMuMnBwM3MgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5tZWFzLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHAzcykgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAzcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHAzcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAzcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAzcywgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMnBzCiMgcGFyIHJhbmdlIFswLCAxXSBmb3IgYWxsIHBhcnMKbW9kLnNlbnMuZml0cy4ycHMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAtMzAKbW9kLnNlbnMuZml0cy4ycHMuMzAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjMwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwLCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIDJwczMgKHBhciByYW5nZSBjb25zdHJhaW50cywgaW5wdXRzIGZpdCB0byBtZWFzIHN0b2NrcykKbW9kLnNlbnMuZml0cy4ycHMzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4ubWVhcy4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgLjE1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAuMDAwNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBvbmx5IikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczMsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzMyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAycHMzIChwYXIgcmFuZ2UgY29uc3RyYWludHMsIGlucHV0cyBmaXQgdG8gbWVhcyBzdG9ja3MsICsgc3RvY2sgY29uc3RyYWludCkKbW9kLnNlbnMuZml0cy4ycHMzcyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLm1lYXMuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICJjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczNzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczNzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczNzIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczNzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczNzLCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIyMgMnA0IChwYXIgcmFuZ2Ugc2V0LCBzdG9jayBhbmQgYnVsayAxNEMgY29zdHMsIEdQUC1iYXNlZCBpbnB1dHMgYnkgZWNvKQojIyAycHAKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBwNC4xMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45NTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIGJ1bGsgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcDQuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwNC4xMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHA0LjEwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcDQuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNC4xMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDIwLTMwCm1vZC5zZW5zLmZpdHMuMnBwNC4zMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45NTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIGJ1bGsgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcDQuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjMwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwNC4zMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHA0LjMwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcDQuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNC4zMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIyAycHMKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzNC4xMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIGJ1bGsgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczQuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzNC4xMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHM0LjEwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczQuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNC4xMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDIwLTMwCm1vZC5zZW5zLmZpdHMuMnBzNC4zMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIGJ1bGsgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczQuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzNC4zMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHM0LjMwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczQuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNC4zMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMjIDJwNHIgKHBhciByYW5nZSBzZXQsIHN0b2NrLCBidWxrLCBhbmQgcmVzcGlyYXRpb24gMTRDIGNvc3RzLCBHUFAtYmFzZWQgaW5wdXRzIGJ5IGVjbykKIyMgMnBwCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcDRyLjEwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45NTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcDRyLjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDRyLjEwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcDRyLjEwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcDRyLjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDRyLjEwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAtMzAKbW9kLnNlbnMuZml0cy4ycHA0ci4zMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHA0ci4zMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMzBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHA0ci4zMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHA0ci4zMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHA0ci4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0ci4zMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIyAycHMKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzNHIuMTAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzNHIuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzNHIuMTAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzNHIuMTAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzNHIuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNHIuMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAyMC0zMAptb2Quc2Vucy5maXRzLjJwczRyLjMwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczRyLjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczRyLjMwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczRyLjMwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczRyLjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczRyLjMwLCBmdW5jdGlvbih4KSB4W1sxXV0pCmBgYAoKYGBge3IgcmVwb3J0LXBhci1maXR9CiMgbG9hZCBpbml0aWFsIHBhcmFtZXRlcnMgYXMgbmVlZGVkCmlmICghZXhpc3RzKCJwYXJzLmkuMnBwIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBwXzIwMjAtMTEtMTYuUmRhdGEiKSAKfQppZiAoIWV4aXN0cygicGFycy5pLjJwcyIpKSB7CiAgbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHNfMjAyMC0xMS0xNi5SZGF0YSIpICAKfQoKIyBsb2FkIGZpdHMgYXMgbmVlZGVkCmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHAiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHBfMjAyMC0xMS0xNi5SRGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcC5wMy41Ljk1IikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBwLnAzLjUuOTVfMjAyMC0xMS0xNi5SZGF0YSIpICAKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBzIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzXzIwMjAtMTEtMTYuUmRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHAyIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBwLmZseC5zdG9ja18yMDIwLTEyLTAyLlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBzMiIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcy5mbHguc3RvY2tfMjAyMC0xMi0wMi5SZGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcDMiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHAzXzIwMjAtMTItMDguUkRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHMzIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzM18yMDIwLTEyLTA4LlJkYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwM3MiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHAzc18yMDIwLTEyLTA4LlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBzM3MiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMzc18yMDIwLTEyLTA4LlJkYXRhIikKfQoKIyMgUGFyIGVzdGltYXRlcwojIDJwcApwYXJzLmZpdC4ycHAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KIyAycHAgZ2FtID0gWy41LCAuOTVdCnBhcnMuZml0LjJwcC5wMy41Ljk1IDwtIGxhcHBseShtb2QuZml0cy4ycHAucDMuNS45NSwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQoKIyAycHMKcGFycy5maXQuMnBzIDwtIGxhcHBseShtb2QuZml0cy4ycHMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCgoKIyAycHAyIChpbnB1dC9zdG9jayBhbmQgMTRDIGNvbnN0cmFpbnRzKQpwYXJzLmZpdC4ycHAyIDwtIGxhcHBseShtb2QuZml0cy4ycHAyLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHAyKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KIyAycHMyIChpbnB1dC9zdG9jayBhbmQgMTRDIGNvbnN0cmFpbnRzKQpwYXJzLmZpdC4ycHMyIDwtIGxhcHBseShtb2QuZml0cy4ycHMyLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KCiMgMnBwMyAoMTRDIGNvbnN0cmFpbnRzLCBjb25zdHJhaW5lZCBwYXIgcmFuZ2VzLCBzdG9jay1maXQgaW5wdXRzKQpwYXJzLmZpdC4ycHAzIDwtIGxhcHBseShtb2QuZml0cy4ycHAzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHAzKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KIyAycHMzICgxNEMgY29uc3RyYWludHMsIGNvbnN0cmFpbmVkIHBhciByYW5nZXMsIHN0b2NrLWZpdCBpbnB1dHMpCnBhcnMuZml0LjJwczMgPC0gbGFwcGx5KG1vZC5maXRzLjJwczMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQoKIyAycHAzcyAoMTRDIGNvbnN0cmFpbnRzLCBjb25zdHJhaW5lZCBwYXIgcmFuZ2VzLCBzdG9jay1maXQgaW5wdXRzLCArIHN0b2NrIGNvbnN0cmFpbnQpCnBhcnMuZml0LjJwcDNzIDwtIGxhcHBseShtb2QuZml0cy4ycHAzcywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwM3MpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQojIDJwczNzICgxNEMgY29uc3RyYWludHMsIGNvbnN0cmFpbmVkIHBhciByYW5nZXMsIHN0b2NrLWZpdCBpbnB1dHMsICsgc3RvY2sgY29uc3RyYWludCkKcGFycy5maXQuMnBzM3MgPC0gbGFwcGx5KG1vZC5maXRzLjJwczNzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMzcykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCgojIyBzdG9jayAmIGJ1bGsgMTRDIGNvc3RzIG9ubHkKIyAycHAKcGFycy5maXQuMnBwNC4xMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBwNC4xMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwNC4xMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnBhcnMuZml0LjJwcDQuMzAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDQuMzAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDQuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjMwXQojIDJwcwpwYXJzLmZpdC4ycHM0LjEwIDwtIGxhcHBseShtb2QuZml0cy4ycHM0LjEwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHM0LjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KcGFycy5maXQuMnBzNC4zMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBzNC4zMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzNC4zMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCgojIyBzdG9jaywgYnVsayBhbmQgcmVzcGlyYXRpb24gMTRDIGNvc3RzCiMgMnBwCnBhcnMuZml0LjJwcDRyLjEwIDwtIGxhcHBseShtb2QuZml0cy4ycHA0ci4xMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwNHIuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpwYXJzLmZpdC4ycHA0ci4zMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBwNHIuMzAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDRyLjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4zMF0KIyAycHMKcGFycy5maXQuMnBzNHIuMTAgPC0gbGFwcGx5KG1vZC5maXRzLjJwczRyLjEwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHM0ci4xMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnBhcnMuZml0LjJwczRyLjMwIDwtIGxhcHBseShtb2QuZml0cy4ycHM0ci4zMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzNHIuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgU3VtbWFyeSBvZiBmaXRzCiMgMnBwCnBhcnMuZml0LjJwcC5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksIAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjJwcC5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKIyAycHMKcGFycy5maXQuMnBzLnN1bSA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLCBmdW5jdGlvbih4KSB7CiAgdHJ5Q2F0Y2goc3VtbWFyeSh4KSwgCiAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMocGFycy5maXQuMnBzLnN1bSkgPC0gbmFtZXMocGFycy5maXQuMnBzKQoKIyMgU3VtbWFyeSBvZiBlcnJvcnMKIyBiZXN0IHBhciBzZXQgKHNzcikKc3NyLjJwcC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHMuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcywgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBwMi5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwMiwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzMi5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzMiwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQojIHN0b2NrIGFuZCBidWxrIDE0QyBjb3N0cyBvbmx5CnNzci4ycHA0LjEwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHA0LjEwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHA0LjMwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHA0LjMwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHM0LjEwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHM0LjEwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHM0LjMwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHM0LjMwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCiMgc3RvY2ssIGJ1bGsgYW5kIHJlc3AgMTRDIGNvc3RzCnNzci4ycHA0ci4xMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBwNHIuMTAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwcDRyLjMwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHA0ci4zMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzNHIuMTAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwczRyLjEwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHM0ci4zMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzNHIuMzAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKCiMgbWVhbiByZXNpZHVhbHMsIGJ5IHZhciAodmFyX21zKQp2YXJfbXMuZGYuZnggPC0gZnVuY3Rpb24obW9kLmZpdHMubHMsIGNvc3RzKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLmxzLCAiWyIsICJ2YXJfbXMiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCiAgaWYgKGxlbmd0aChjb3N0cykgPT0gMiApIHsKICAgIGRmJHZhciA8LSByZXAoYygicmVzcCIsICJidWxrQyIpLCBucm93KGRmKS8yKQogIH0gZWxzZSB7CiAgICBkZiR2YXIgPC0gcmVwKGMoInJlc3AiLCAiYnVsa0MiLCAiZmx4LnN0b2NrIiksIG5yb3coZGYpLzMpCiAgfQogIGRmJHZhcl9tcyA8LSByb3VuZChkZiR2YXJfbXMsIDUpCiAgcmV0dXJuKGRmKQp9CnZhcl9tcy4ycHAuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcCwgYygicmVzcCIsICJidWxrQyIpKQp2YXJfbXMuMnBwLnAzLjUuOTUuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcC5wMy41Ljk1LCBjKCJyZXNwIiwgImJ1bGtDIikpCnZhcl9tcy4ycHMuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcywgYygicmVzcCIsICJidWxrQyIpKQp2YXJfbXMuMnBwMi5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBwMiwgYygicmVzcCIsICJidWxrQyIsICJmbHguc3RvY2siKSkKdmFyX21zLjJwczIuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwczIsIGMoInJlc3AiLCAiYnVsa0MiLCAiZmx4LnN0b2NrIikpCgojIGJpbmQgZml0dGVkIHBhcnMgd2l0aCBpbml0aWFsIHBhcnMgaW50byBkYXRhIGZyYW1lIGZvciBwbG90dGluZy9zdW1tYXJpemluZwpwYXIuZml0LmRmLmZ4IDwtIGZ1bmN0aW9uKG1vZCwgcGFycy5maXQsIHBhcnMuaSkgewogIGRmIDwtIGJpbmRfcm93cygKICAgIGxhcHBseSgKICAgICAgbWFwcGx5KHJiaW5kLCAKICAgICAgICAgICAgIHBhcnMuZml0LAogICAgICAgICAgICAgcGFycy5pLAogICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSksIAogICAgICBmdW5jdGlvbihkZikgewogICAgICAgIGRmIDwtIGRhdGEuZnJhbWUoZGYpCiAgICAgICAgaWYgKG1vZCA9PSAiMnBwIikgewogICAgICAgICAgY29sbmFtZXMoZGYpIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImdhbSIpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbG5hbWVzKGRmKSA8LSBjKCJrZmFzdCIsICJrc2xvdyIsICJhMjEiKQogICAgICAgIH0KICAgICAgICBkZiRlc3QgPC0gYygiZml0IiwgImluaXQiKQogICAgICAgIHJldHVybihkZikKICAgICAgfSkKICApCiAgZGYkUE1lY29fZGVwdGggPC0gcmVwKG5hbWVzKHBhcnMuaSksIGVhY2ggPSAyKQogIGRmJFBNIDwtIHN1YnN0cihkZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAxLCBzdG9wID0gMikKICBkZiRlY28gPC0gc3Vic3RyKGRmJFBNZWNvX2RlcHRoLCBzdGFydCA9IDMsIHN0b3AgPSA0KQogIGRmJGRlcHRoIDwtIHN1YnN0cihkZiRQTWVjb19kZXB0aCwgc3RhcnQgPSA2LCBzdG9wID0gbGVuZ3RoKGRmJFBNZWNvX2RlcHRoKSkKICByZXR1cm4oZGYpCn0KCgojIyAycHAKIyBnYW0gcmFuZ2UgPSBbMCwgMV0KcGFycy5maXQuMnBwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKIyBnYW0gcmFuZ2UgPSBbLjUsIC45NV0KcGFycy5maXQuMnBwLnAzLjUuOTUuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcC5wMy41Ljk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQojIHcvIGlucHV0L3N0b2NrIGNvc3QgYW5kIGdhbSByYW5nZSA9IFsuNSwgLjk1XQpwYXJzLmZpdC4ycHAyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKCiMjIDJwcwojIGEyMSByYW5nZSA9IFswLCAxXQpwYXJzLmZpdC4ycHMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojIHcvIGlucHV0L3N0b2NrIGNvc3QgYW5kIGEyMSByYW5nZSA9IFswLCAxXQpwYXJzLmZpdC4ycHMyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCgojIyBDb25zdHJhaW5lZCBwYXIgcmFuZ2VzLCB3aXRoIGFuZCB3aXRob3V0IHN0b2NrIGNvbnN0cmFpbnQKIyB3L28gc3RvY2sKcGFycy5maXQuMnBwMy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCnBhcnMuZml0LjJwczMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojIHcvIHN0b2NrCnBhcnMuZml0LjJwcDNzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKcGFycy5maXQuMnBzM3MuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojIHcvIHN0b2NrICYgYnVsayAxNEMgb25seQpwYXJzLmZpdC4ycHA0LjEwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDQuMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKcGFycy5maXQuMnBwNC4zMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHA0LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4zMF0pCnBhcnMuZml0LjJwczQuMTAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzNC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQpwYXJzLmZpdC4ycHM0LjMwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczQuMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCiMgdy8gc3RvY2ssIGJ1bGsgKyByZXNwIDE0QwpwYXJzLmZpdC4ycHA0ci4xMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHA0ci4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQpwYXJzLmZpdC4ycHA0ci4zMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHA0ci4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMzBdKQpwYXJzLmZpdC4ycHM0ci4xMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHM0ci4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQpwYXJzLmZpdC4ycHM0ci4zMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHM0ci4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMzBdKQoKCiMjIFN1bW1hcml6ZSBieSBQTSwgZGVwdGgKIyAycHAKIyBQTS9kZXB0aApwYXJzLmZpdC4ycHAuZGYuUE0gPC0gcGFycy5maXQuMnBwLmRmICU+JQogICAgZmlsdGVyKGVzdCA9PSAiZml0IikgJT4lCiAgICBzZWxlY3QoIWMoZXN0LCBQTWVjb19kZXB0aCwgZWNvKSkgJT4lCiAgICBncm91cF9ieShQTSwgZGVwdGgpICU+JQogICAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAyKQojIHByaW50IHRhYmxlCmtuaXRyOjprYWJsZShwYXJzLmZpdC4ycHAuZGYuUE0sCiAgICAgICAgICAgICBjYXB0aW9uID0gIk1lYW4gcGFyYW1ldGVyIGVzdGltYXRlcyBieSBwYXJlbnQgbWF0ZXJpYWwgKFBNKSIsCiAgICAgICAgICAgICBhbGlnbiA9ICJjIikKIyBlY28vZGVwdGgKcGFycy5maXQuMnBwLmRmLmVjbyA8LSBwYXJzLmZpdC4ycHAuZGYgJT4lCiAgZmlsdGVyKGVzdCA9PSAiZml0IikgJT4lCiAgbXV0YXRlKGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBzZWxlY3QoIWMoZXN0LCBQTWVjb19kZXB0aCwgUE0pKSAlPiUKICBncm91cF9ieShlY28sIGRlcHRoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAyKQojIHByaW50IHRhYmxlCmtuaXRyOjprYWJsZShwYXJzLmZpdC4ycHAuZGYuZWNvLAogICAgICAgICAgICAgY2FwdGlvbiA9ICJNZWFuIHBhcmFtZXRlciBlc3RpbWF0ZXMgYnkgZWNvc3lzdGVtIChlY28pIiwKICAgICAgICAgICAgIGFsaWduID0gImMiKQpgYGAKCmBgYHtyIHNlbnMtZnVuLWZpdHN9CiMjIGxvb2sgYXQgc2Vuc0Z1biBvdXRwdXQKIyB3aXRob3V0IGNvbnN0cmFpbnRzCnNlbnMuMnBwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKIyB3aXRob3V0IHN0b2NrIGNvbnN0cmFpbnQKc2Vucy4ycHAzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQKc2Vucy4ycHAzcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAzcywgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczNzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczNzLCBmdW5jdGlvbih4KSB4W1syXV0pCiMgd2l0aCBzdG9jayBjb25zdHJhaW50LCB3L28gcmVzcApzZW5zLjJwcDQuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNC4xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcDQuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNC4zMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczQuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNC4xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczQuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNC4zMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQojIHdpdGggc3RvY2sgY29uc3RyYWludCArIHJlc3AKc2Vucy4ycHA0ci4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0ci4xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcDRyLjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDRyLjMwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzNHIuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNHIuMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHM0ci4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0ci4zMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQoKCiMgcGxvdCBzZW5zaXRpdml0eQojIHcvbyBjb25zdHJhaW50cwpsYXBwbHkoc2Vucy4ycHAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpsYXBwbHkoc2Vucy4ycHMsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQojIHcvbyBzdG9jayBjb25zdHJhaW50CmxhcHBseShzZW5zLjJwcDMsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczMsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwcDNzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHMzcywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQsIHcvbyByZXNwCmxhcHBseShzZW5zLjJwcDQuMTAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwcDQuMzAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczQuMTAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczQuMzAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCiMgd2l0aCBzdG9jayBjb25zdHJhaW50ICsgcmVzcApsYXBwbHkoc2Vucy4ycHA0ci4xMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBwNHIuMzAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczRyLjEwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHM0ci4zMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKCgojIGxvb2sgYXQgaWRlbnRpZmlhYmlsaXR5CmluZGVuLmRmLmZ4IDwtIGZ1bmN0aW9uKGxzLCBtb2QpIHsKICBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIGRmIDwtIGNvbGxpbih4KQogICAgaWYgKG1vZCA9PSAiMnBwIikgewogICAgICBkZiRQYXJDb21ibyA8LSBmYWN0b3IoYygiazEgKyBrMiIsICJrMSArIGdhbSIsICJrMiArIGdhbSIsICJrMSArIGsyICsgZ2FtIikpCiAgICB9IGVsc2UgewogICAgICBkZiRQYXJDb21ibyA8LSBmYWN0b3IoYygiazEgKyBrMiIsICJrMSArIGEyMSIsICJrMiArIGEyMSIsICJrMSArIGsyICsgYTIxIikpCiAgICB9CiAgICByZXR1cm4oZGYpCiAgfSkKfQoKaWRlbi4ycHAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHAsIG1vZCA9ICIycHAiKQppZGVuLjJwcyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcywgbW9kID0gIjJwcyIpCmlkZW4uMnBwMyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDMsIG1vZCA9ICIycHAiKQppZGVuLjJwczMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMzLCBtb2QgPSAiMnBzIikKaWRlbi4ycHAzcyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDNzLCBtb2QgPSAiMnBwIikKaWRlbi4ycHMzcyA8LSBpbmRlbi5kZi5meChzZW5zLjJwczNzLCBtb2QgPSAiMnBzIikKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQsIHcvbyByZXNwCmlkZW4uMnBwNC4xMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDQuMTAsIG1vZCA9ICIycHAiKQppZGVuLjJwcDQuMzAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHA0LjMwLCBtb2QgPSAiMnBwIikKaWRlbi4ycHM0LjEwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzNC4xMCwgbW9kID0gIjJwcyIpCmlkZW4uMnBzNC4zMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwczQuMzAsIG1vZCA9ICIycHMiKQojIHdpdGggc3RvY2sgY29uc3RyYWludCArIHJlc3AKaWRlbi4ycHA0ci4xMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDRyLjEwLCBtb2QgPSAiMnBwIikKaWRlbi4ycHA0ci4zMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDRyLjMwLCBtb2QgPSAiMnBwIikKaWRlbi4ycHM0ci4xMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwczRyLjEwLCBtb2QgPSAiMnBzIikKaWRlbi4ycHM0ci4zMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwczRyLjMwLCBtb2QgPSAiMnBzIikKCiMgaWRlbnRpZmlhYmlsaXR5IHBsb3QgZnVuY3Rpb24KY29sbC5wbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCBtb2QsIFBNZWNvX2RlcHRoLCBjb2wubWF4KSB7CiAgZ2dwbG90KGRmLCBhZXMoTiwgbG9nKGNvbGxpbmVhcml0eSksIGNvbG9yID0gUGFyQ29tYm8pKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBsb2coMjApKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzLjUsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuMSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIGxvZyhjb2wubWF4KSkpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEuNSwgMy41KSwgYnJlYWtzID0gYygyLCAzKSkgKwogICAgbGFicyh0aXRsZSA9IHBhc3RlKFBNZWNvX2RlcHRoLCBtb2QpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGlmIChtb2QgPT0gIjJwcCIgfCBtb2QgPT0gIjJwcCArIHN0b2NrIikgewogICAgIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgICAgIG5hbWUgPSAiUGFyYW1ldGVyIGNvbWJpbmF0aW9uIiwKICAgICAgIHZhbHVlcyA9IGMoImsxICsgazIiID0gIiNFRjQ3NkYiLAogICAgICAgICAgICAgICAgICAiazEgKyBnYW0iID0gIiNGRkQxNjYiLAogICAgICAgICAgICAgICAgICAiazIgKyBnYW0iID0gIiMxMThBQjIiLAogICAgICAgICAgICAgICAgICAiazEgKyBrMiArIGdhbSIgPSAiMDczQjRDIikpIAogICAgfSBlbHNlIHsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgIG5hbWUgPSAiUGFyYW1ldGVyIGNvbWJpbmF0aW9uIiwKICAgICAgICB2YWx1ZXMgPSBjKCJrMSArIGsyIiA9ICIjRUY0NzZGIiwKICAgICAgICAgICAgICAgICAgImsxICsgYTIxIiA9ICIjRkZEMTY2IiwKICAgICAgICAgICAgICAgICAgImsyICsgYTIxIiA9ICIjMTE4QUIyIiwKICAgICAgICAgICAgICAgICAgImsxICsgazIgKyBhMjEiID0gIjA3M0I0QyIpKQogICAgfQp9CmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwW1tpXV0sIG1vZCA9ICIycHAiLCBuYW1lcyhpZGVuLjJwcClbaV0sIG1heChpZGVuLjJwcFtbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzW1tpXV0sIG1vZCA9ICIycHMiLCBuYW1lcyhpZGVuLjJwcylbaV0sIG1heChpZGVuLjJwc1tbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHAzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDNbW2ldXSwgbW9kID0gIjJwcCIsIG5hbWVzKGlkZW4uMnBwMylbaV0pCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHAzcyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHAzc1tbaV1dLCBtb2QgPSAiMnBwICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwcDNzKVtpXSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzM1tbaV1dLCBtb2QgPSAiMnBzIiwgbmFtZXMoaWRlbi4ycHMzKVtpXSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczNzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczNzW1tpXV0sIG1vZCA9ICIycHMgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBzM3MpW2ldKQp9KQojIHN0b2NrIGNvbnN0cmFpbnQsIHcvbyByZXNwCmNvbC5tYXggPC0gbWF4KHVubGlzdChsaXN0KGxhcHBseShpZGVuLjJwczQuMTAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwczQuMzAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwcDQuMTAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwcDQuMzAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSkpKSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczQuMTApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzNC4xMFtbaV1dLCBtb2QgPSAiMnBzICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwczQuMTApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHM0LjMwW1tpXV0sIG1vZCA9ICIycHMgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBzNC4zMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHA0LjEwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDQuMTBbW2ldXSwgbW9kID0gIjJwcCArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHA0LjEwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDQuMzApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwNC4zMFtbaV1dLCBtb2QgPSAiMnBwICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwcDQuMzApW2ldLCBjb2wubWF4KQp9KQoKIyBzdG9jayBjb25zdHJhaW50ICsgcmVzcApjb2wubWF4LnIgPC0gbWF4KHVubGlzdChsaXN0KGxhcHBseShpZGVuLjJwczRyLjEwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwczRyLjMwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwcDRyLjEwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpZGVuLjJwcDRyLjMwLCBmdW5jdGlvbihkZikgZGZbWyJjb2xsaW5lYXJpdHkiXV0pKSkpCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHA0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHA0ci4xMFtbaV1dLCBtb2QgPSAiMnBwIiwgbmFtZXMoaWRlbi4ycHA0ci4xMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHA0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHA0ci4zMFtbaV1dLCBtb2QgPSAiMnBzIiwgbmFtZXMoaWRlbi4ycHA0ci4zMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHM0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHM0ci4xMFtbaV1dLCBtb2QgPSAiMnBzICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwczRyLjEwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczRyLjMwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczRyLjMwW1tpXV0sIG1vZCA9ICIycHMgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBzNHIuMzApW2ldLCBjb2wubWF4KQp9KQpgYGAKCgpgYGB7ciBwbG90LW1vZEZpdC1wYXJzfQojIyBwbG90IHBhcnMKcGFyLnBsb3QuZnggPC0gZnVuY3Rpb24obW9kLCBkZXB0aCwgcGFyLmRmLCBpbml0aWFsID0gRkFMU0UpIHsKICBwYXIuZGYgJT4lCiAgICB7IGlmIChpbml0aWFsID09IFRSVUUpIC4gZWxzZSBmaWx0ZXIoLiwgZXN0ID09ICJmaXQiKSB9ICU+JQogICAgZmlsdGVyKGRlcHRoID09IGRlcHRoKSAlPiUKICAgIHBpdm90X2xvbmdlcighKGVzdDpkZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogICAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGNvbG9yID0gUE0sIHNoYXBlID0gZWNvKSkgKwogICAgIyBnZW9tX2ppdHRlcihzaXplID0gNCkgKwogICAgZ2VvbV9wb2ludChzaXplID0gNCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC41KSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgICBnZ3RpdGxlKHBhc3RlMCgibW9kRml0IHBhcnMgIiwgbW9kLCAiICIsIGRlcHRoKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQp9CiMgMC0xMAojIDJwcApwYXIucGxvdC5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIDJwcCwgZ2FtID0gWy41LC45NV0KcGFyLnBsb3QuZngobW9kID0gIjJwcCAoZ2FtID0gWzAuNSwgMC45NV0pIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcC5wMy41Ljk1LmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBwMgpwYXIucGxvdC5meChtb2QgPSAiMnBwMiIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHAyLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBzCnBhci5wbG90LmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBzMgpwYXIucGxvdC5meChtb2QgPSAiMnBzMiIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMyLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCgojIHcvIGFuZCB3L28gc3RvY2sgY29uc3RyYWludApwYXIucGxvdC5meChtb2QgPSAiMnBwMyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHAzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHAzcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHAzcy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzMyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHMzcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMzcy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQoKIyMgZmx1eCBlc3QgaW5wdXRzIGJ5IGVjbwojIHN0b2NrIGFuZCBidWxrIDE0QyBvbmx5CnBhci5wbG90LmZ4KG1vZCA9ICIycHA0IiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDQuMTAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcDQiLAogICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDQuMzAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczQiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzNC4xMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzNCIsCiAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzNC4zMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQoKIyBzdG9jayBhbmQgYnVsayArIHJlc3AgMTRDCnBhci5wbG90LmZ4KG1vZCA9ICIycHA0ciIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHA0ci4xMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBwNHIiLAogICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDRyLjMwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHM0ciIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHM0ci4xMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzNHIiLAogICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczRyLjMwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCmBgYAoKYGBge3IgZml0LXNvYy1pbn0KIyMgRmluZCBiZXN0IGlucHV0cwojIDJwcAppbi5maXQuMnBwIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuZml0LjJwcClbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcCIsIHBhcnMuZml0LjJwcFtbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBwKSA8LSBuYW1lcyhtb2QuZml0cy4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQppbi5maXQuMnBwLnAzLjUuOTUgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSlbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcCIsIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV0sIGluLmlbaXguMTBdW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLmZpdC4ycHAucDMuNS45NSkgPC0gbmFtZXMobW9kLmZpdHMuMnBwLnAzLjUuOTUpCiMgMnBwMgppbi5maXQuMnBwMiA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDIpLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5maXQuMnBwMilbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcCIsIHBhcnMuZml0LjJwcDJbW2ldXSwgaW4uZmx4LnN0b2NrW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLmZpdC4ycHAyKSA8LSBuYW1lcyhtb2QuZml0cy4ycHAyKQojIDJwcwppbi5maXQuMnBzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuZml0LjJwcylbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcyIsIHBhcnMuZml0LjJwc1tbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBzKSA8LSBuYW1lcyhtb2QuZml0cy4ycHMpCiMgMnBzMgppbi5maXQuMnBzMiA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczIpLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5maXQuMnBzMilbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngoIjJwcyIsIHBhcnMuZml0LjJwczJbW2ldXSwgaW4uZmx4LnN0b2NrW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLmZpdC4ycHMyKSA8LSBuYW1lcyhtb2QuZml0cy4ycHMyKQoKIyMgQ2FsYyBtb2RlbGVkIHN0b2NrcyBhbmQgY29tcGFyZSB3aXRoIG1lYXN1cmVkIHN0b2NrcwojIDJwcAptb2Quc29jcy4ycHAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHBbW2ldXSwgaW4uZml0LjJwcFtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKc29jcy4ycHAubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgY3NvYy4xOS4wXzMwW2l4LjEwXSwgCiAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBwLmxzLCBjb2xTdW1zKSwgCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KbW9kLnNvY3MuMnBwLnAzLjUuOTUubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV0sIGluLmZpdC4ycHAucDMuNS45NVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHAucDMuNS45NS5scykgPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpCnNvY3MuMnBwLnAzLjUuOTVscyA8LSBtYXBwbHkoY2JpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NvYy4xOS4wXzMwW2l4LjEwXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KG1vZC5zb2NzLjJwcC5wMy41Ljk1LmxzLCBjb2xTdW1zKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkKIyAycHAyCm1vZC5zb2NzLjJwcDIubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAyKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwMltbaV1dLCBpbi5maXQuMnBwMltbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHAyLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAyKQoKIyAycHMKbW9kLnNvY3MuMnBzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzW1tpXV0sIGluLmZpdC4ycHNbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpCnNvY3MuMnBzLmxzIDwtIG1hcHBseShjYmluZCwKICAgICAgICAgICAgICAgICAgICAgIGNzb2MuMTkuMF8zMFtpeC4xMF0sIAogICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KG1vZC5zb2NzLjJwcy5scywgY29sU3VtcyksIAogICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkKIyAycHMyCm1vZC5zb2NzLjJwczIubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMyKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzMltbaV1dLCBpbi5maXQuMnBzMltbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMyLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMyKQoKIyMgc3RvY2sgYW5kIGJ1bGsgMTRDIGNvc3RzIG9ubHkKIyAycHAKbW9kLnNvY3MuMnBwNC4xMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDQuMTApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHA0LjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwNC4xMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwNC4xMCkKbW9kLnNvY3MuMnBwNC4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDQuMzApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHA0LjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwNC4zMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwNC4zMCkKIyAycHMKbW9kLnNvY3MuMnBzNC4xMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczQuMTApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHM0LjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzNC4xMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBzNC4xMCkKbW9kLnNvY3MuMnBzNC4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczQuMzApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHM0LjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzNC4zMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBzNC4zMCkKCiMjIHN0b2NrIGFuZCBidWxrICsgcmVzcCAxNEMgY29zdHMKIyAycHAKbW9kLnNvY3MuMnBwNHIuMTAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcDRyLjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBwNHIuMTAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDRyLjEwKQptb2Quc29jcy4ycHA0ci4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDRyLjMwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwNHIuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHA0ci4zMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwNHIuMzApCiMgMnBzCm1vZC5zb2NzLjJwczRyLjEwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHM0ci4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwczRyLjEwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0ci4xMCkKbW9kLnNvY3MuMnBzNHIuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwczRyLjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzNHIuMzAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczRyLjMwKQoKCiMjIFJldHVybiBkYXRhIGZyYW1lcyBvZiBtb2RlbCBmaXRzIHdpdGggYWRqdXN0ZWQgaW5wdXRzIGFuZCBvcHRpbWFsIHBhcmFtZXRlcnMKIyAycHAKVHdvcHAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwW1tpXV0sIGluLmZpdC4ycHBbW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIikKfSkKbmFtZXMoVHdvcHAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KVHdvcHAucDMuNS45NS5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwLnAzLjUuOTUpLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV0sIGluLmZpdC4ycHAucDMuNS45NVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiKQp9KQpuYW1lcyhUd29wcC5wMy41Ljk1LmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQojIDJwcDIKVHdvcHAyLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAyKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHAyW1tpXV0sIGluLmZpdC4ycHAyW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIpCn0pCm5hbWVzKFR3b3BwMi5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAyKQojIDJwcwpUd29wcy5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHNbW2ldXSwgaW4uZml0LjJwc1tbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiKQp9KQpuYW1lcyhUd29wcy5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpCiMgMnBzMgpUd29wczIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczIpLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwczJbW2ldXSwgaW4uZml0LjJwczJbW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IFRSVUUpCn0pCm5hbWVzKFR3b3BzMi5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMyKQoKIyMgc3RvY2sgYW5kIGJ1bGsgMTRDIGNvc3RzIG9ubHkKIyAycHAKVHdvcHA0LjEwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0LjEwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHA0LjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wcDQuMTAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwNC4xMCkKVHdvcHA0LjMwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0LjMwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHA0LjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wcDQuMzAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwNC4zMCkKIyAycHMKVHdvcHM0LjEwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0LjEwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHM0LjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wczQuMTAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzNC4xMCkKVHdvcHM0LjMwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0LjMwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHM0LjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wczQuMzAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzNC4zMCkKCiMjIHN0b2NrIGFuZCBidWxrICsgcmVzcCAxNEMgY29zdHMKIyAycHAKVHdvcHA0ci4xMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcDRyLjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wcDRyLjEwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDRyLjEwKQpUd29wcDRyLjMwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwNHIuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BwNHIuMzAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwNHIuMzApCiMgMnBzClR3b3BzNHIuMTAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczRyLjEwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHM0ci4xMFtbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHM0ci4xMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0ci4xMCkKVHdvcHM0ci4zMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwczRyLjMwW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wczRyLjMwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczRyLjMwKQpgYGAKCmBgYHtyIHBsb3Qtc29jLXN0b2Nrc30KIyBQbG90IG9wdGltaXplZCBtb2RlbCBTT0Mgc3RvY2tzCm1vZC5zb2NzLmRmLmZ4IDwtIGZ1bmN0aW9uKG1vZCwgbW9kLnNvY3MubHMsIHBvb2xzKSB7CiAgbiA8LSB2YXBwbHkobW9kLnNvY3MubHMsIG5yb3csIG51bWVyaWMoMSkpCiAgcmV0dXJuKGRhdGEuZnJhbWUoU09DID0gZG8uY2FsbChyYmluZCwgbW9kLnNvY3MubHMpLAogICAgICAgICAgICAgICAgICAgIHBvb2wgPSByZXAocG9vbHMsIGxlbmd0aChtb2Quc29jcy5scykpLAogICAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gcmVwKG5hbWVzKG1vZC5zb2NzLmxzKSwgbiksCiAgICAgICAgICAgICAgICAgICAgTW9kZWwgPSByZXAobW9kLCBzdW0obikpKSkgICAgICAgCn0KIyBydW4gZngKIyBtb2Quc29jcy4ycC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwIiwgbW9kLnNvY3MuMnBwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcyIsIG1vZC5zb2NzLjJwcy5scywgYygiZmFzdCIsICJzbG93IikpCiMgICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHAgWy41LC45NV0iLCBtb2Quc29jcy4ycHAucDMuNS45NS5scywgYygiZmFzdCIsICJzbG93IikpCiMgICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHMyIiwgbW9kLnNvY3MuMnBzMi5scywgYygiZmFzdCIsICJzbG93IikpCiMgICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHAyIiwgbW9kLnNvY3MuMnBwMi5scywgYygiZmFzdCIsICJzbG93IikpCiMgICAgICAgICAgICAgICAgICAgICAgICAgKQptb2Quc29jcy4ycC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwIiwgbW9kLnNvY3MuMnBwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHMiLCBtb2Quc29jcy4ycHMubHMsIGMoImZhc3QiLCAic2xvdyIpKQogICAgICAgICAgICAgICAgICAgICAgICApCgoKIyBzdG9ja3MgYW5kIGJ1bGsgMTRDIG9ubHkKbW9kLnNvY3MuMnA0LjEwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHA0IDAtMTAiLCBtb2Quc29jcy4ycHA0LjEwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSksIG1vZC5zb2NzLmRmLmZ4KCIycHM0IDAtMTAiLCBtb2Quc29jcy4ycHM0LjEwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkpCm1vZC5zb2NzLjJwNC4zMC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwNCAyMC0zMCIsIG1vZC5zb2NzLjJwcDQuMzAubHMsIGMoImZhc3QiLCAic2xvdyIpKSAsbW9kLnNvY3MuZGYuZngoIjJwczQgMjAtMzAiLCBtb2Quc29jcy4ycHM0LjMwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkpCgojIHN0b2NrcyBhbmQgYnVsayArIHJlc3AgMTRDCm1vZC5zb2NzLjJwNHIuMTAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcDRyIDAtMTAiLCBtb2Quc29jcy4ycHA0ci4xMC5scywgYygiZmFzdCIsICJzbG93IikpLCBtb2Quc29jcy5kZi5meCgiMnBzNHIgMC0xMCIsIG1vZC5zb2NzLjJwczRyLjEwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkpCm1vZC5zb2NzLjJwNHIuMzAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcDRyIDIwLTMwIiwgbW9kLnNvY3MuMnBwNHIuMzAubHMsIGMoImZhc3QiLCAic2xvdyIpKSAsbW9kLnNvY3MuZGYuZngoIjJwczRyIDIwLTMwIiwgbW9kLnNvY3MuMnBzNHIuMzAubHMsIGMoImZhc3QiLCAic2xvdyIpKSkKCiMgY29tYmluZSBpbnB1dHMgdG8gY29tcGFyZQojIGluLmZpdHMuZGYgPC0gcGl2b3RfbG9uZ2VyKGRvLmNhbGwoYmluZF9yb3dzLCBsaXN0KGluLmZpdC4ycHAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uZml0LjJwcC5wMy41Ljk1LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmZpdC4ycHAyLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmZpdC4ycHMsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uZml0LjJwczIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiUE1lY29fZGVwdGgiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJpbnB1dHMiKQojIGluLmZpdHMuZGYkbW9kIDwtIHJlcChjKCIycHAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIycHAuNS45NSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjJwcDIiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIycHMyIiksCiMgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggPSA5KQppbi5maXRzLmRmIDwtIHBpdm90X2xvbmdlcihkby5jYWxsKGJpbmRfcm93cywgbGlzdChpbi5maXQuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5maXQuMnBzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiUE1lY29fZGVwdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiaW5wdXRzIikKaW4uZml0cy5kZiRtb2QgPC0gcmVwKGMoIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICIycHMiKSwKICAgICAgICAgICAgICAgICAgICAgIGVhY2ggPSA5KQogICAgICAgICAgICAgICAgICAgICAgICAKIyMgcGxvdCBzdG9ja3MKIyBzdG9jayBhbmQgYnVsayAxNEMgb25seQptb2Quc29jcy4ycDQuMTAuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKbW9kLnNvY3MuMnA0LjMwLmRmICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBTT0MsIGZpbGwgPSBNb2RlbCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgc3RvY2sgYW5kIGJ1bGsgKyByZXNwIDE0Qwptb2Quc29jcy4ycDRyLjEwLmRmICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBTT0MsIGZpbGwgPSBNb2RlbCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCm1vZC5zb2NzLjJwNHIuMzAuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgaW5wdXRzCmluLmZpdHMuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgIyBNb2RlbCA9IGZhY3RvcihNb2RlbCwgbGV2ZWxzID0gYygiMnBwIFsuNSwuOTVdIiwgIjJwcCIsICIycHMiKSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtb2QsIGlucHV0cywgZmlsbCA9IG1vZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKFBNKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgcGxvdC1vcHQtbW9kLTJwcH0KIyBwbG90IGZ4ClR3b3AuZml0LnBsb3QuZnggPC0gZnVuY3Rpb24oZml0MSwgZml0MS5uYW1lLCBmaXQyLCBmaXQyLm5hbWUsIGZpdDMgPSBOVUxMLCBmaXQzLm5hbWUgPSBOVUxMKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhmaXQxKSwgZnVuY3Rpb24oaSkgewogICAgUE1lY28gPC0gc3Vic3RyKG5hbWVzKGZpdDEpW2ldLCAxLCA0KQogICAgbHlyX2JvdCA8LSBzdWJzdHIobmFtZXMoZml0MSlbaV0sIAogICAgICAgICAgICAgICAgICAgICAgbmNoYXIobmFtZXMoZml0MSlbaV0pIC0gMSwgCiAgICAgICAgICAgICAgICAgICAgICBuY2hhcihuYW1lcyhmaXQxKVtpXSkpCiAgICBseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKICAgIFBNZWNvX2RlcHRoIDwtIG5hbWVzKGZpdDEpW2ldCiAgICBjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvX2RlcHRoKQogICAgcGxvdC5kZiA8LSByYmluZChmaXQxW1tpXV0sCiAgICAgICAgICAgICAgICAgICAgIGZpdDJbW2ldXSwKICAgICAgICAgICAgICAgICAgICAgZml0M1tbaV1dKQogICAgcGxvdC5kZiRNb2RlbCA8LSBmYWN0b3IoYyhyZXAoZml0MS5uYW1lLCBucm93KGZpdDFbW2ldXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoZml0Mi5uYW1lLCBucm93KGZpdDJbW2ldXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoZml0My5uYW1lLCBucm93KGZpdDNbW2ldXSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoZml0MS5uYW1lLCBmaXQyLm5hbWUsIGZpdDMubmFtZSkpCiAgICByZXR1cm4ocGxvdC5kZiAlPiUKICAgICAgICAgICAgIGZpbHRlcihwb29sID09ICJidWxrIEMiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iIHwgcG9vbCA9PSAiYXRtIikgJT4lCiAgICAgICAgICAgICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgICAgICAgICAgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gTW9kZWwpKSArCiAgICAgICAgICAgICBnZW9tX3BvaW50KGRhdGEgPSBjb24uZGYsIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBvb2wpLCBzaXplID0gMykgKwogICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgICAgICAgICBuYW1lID0gIk1vZGVsIHBvb2wiLAogICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVsayBDIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciKSkgKwogICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICAgICAgICAgICAgIGdndGl0bGUocGFzdGUwKFBNZWNvX2RlcHRoLCAiIDJwIG1vZCBmaXRzIikpICsKICAgICAgICAgICAgIHhsYWIoIlllYXIiKSArCiAgICAgICAgICAgICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSkKICB9KQp9CiMgMnAgbW9kRml0IG9wdGltYWwgbW9kZWwgY29tcGFyaXNvbgpUd29wLmZpdHMucGxvdHMgPC0gVHdvcC5maXQucGxvdC5meChUd29wcC5maXRzLCAiMnBwIiwgVHdvcHMuZml0cywgIjJwcyIpClR3b3AuZml0cy5wbG90cwojIFR3b3AuZml0cy5wbG90czIgPC0gVHdvcC5maXQucGxvdC5meChUd29wcC5maXRzLCAiMnBwIiwgVHdvcHAucDMuNS45NS5maXRzLCAiMnBwIGdhbSA9IFsuNSwgLjk1XSIpCiMgVHdvcC5maXRzLnBsb3RzMgpUd29wLmZpdHMucGxvdHMzIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHAucDMuNS45NS5maXRzLCAiMnBwIGdhbSA9IFsuNSwgLjk1XSIsIFR3b3BwMi5maXRzLCAiMnBwMiIpClR3b3AuZml0cy5wbG90czMKCiMjIGNvbXBhcmUgZml0cyB3LyBhbmQgdy9vIHJlc3AgY29uc3RyYWludCAoMnA0IG1vZHMpCiMgMnBwClR3b3BwNC5maXRzLnBsb3RzLjEwIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHA0LjEwLmZpdHMsICIycHA0IDAtMTBjbSB3L28gcmVzcCIsIFR3b3BwNHIuMTAuZml0cywgIjJwcDRyIDAtMTBjbSB3LyByZXNwIikKVHdvcHA0LmZpdHMucGxvdHMuMzAgPC0gVHdvcC5maXQucGxvdC5meChUd29wcDQuMzAuZml0cywgIjJwcDQgMjAtMzBjbSB3L28gcmVzcCIsIFR3b3BwNHIuMTAuZml0cywgIjJwcDRyIDIwLTMwY20gdy8gcmVzcCIpCiMgMnBzClR3b3BzNC5maXRzLnBsb3RzLjEwIDwtIFR3b3AuZml0LnBsb3QuZngoVHdvcHM0LjEwLmZpdHMsICIycHM0IDAtMTBjbSB3L28gcmVzcCIsIFR3b3BzNHIuMTAuZml0cywgIjJwczRyIDAtMTBjbSB3LyByZXNwIikKVHdvcHM0LmZpdHMucGxvdHMuMzAgPC0gVHdvcC5maXQucGxvdC5meChUd29wczQuMzAuZml0cywgIjJwczQgMjAtMzBjbSB3L28gcmVzcCIsIFR3b3BzNHIuMTAuZml0cywgIjJwczRyIDIwLTMwY20gdy8gcmVzcCIpCiMgcGxvdApUd29wcDQuZml0cy5wbG90cy4xMApUd29wcDQuZml0cy5wbG90cy4zMApUd29wczQuZml0cy5wbG90cy4xMApUd29wczQuZml0cy5wbG90cy4zMApgYGAKCmBgYHtyIFNBQi1vYnN9CnAgPC0gc3JhLnRzLmFsbCAlPiUKICAgIGZpbHRlcihkMTRjID4gLTIwMCkgJT4lCiAgICBmaWx0ZXIoRUNPICE9ICJyZiIpICU+JQogICAgZmlsdGVyKGx5cl9ib3QgPT0gMjApICU+JQogICAgZmlsdGVyKHllYXIgIT0gMjAwOSkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKHllYXIsIGQxNGMpKSArCiAgICBnZW9tX3BhdGgoZGF0YSA9IGF0bS4xNGMpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvVHlwZSksIHNpemUgPSAzLjUpICsKICAgIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgbGluZXR5cGUgPSBUeXBlKSwgc2l6ZSA9IDEsIGFscGhhID0gMC4zKSArCiAgICBnZW9tX2Vycm9yYmFyKAogICAgICAgIGFlcyh5bWluID0gZDE0Y19sLCAKICAgICAgICAgICAgeW1heCA9IGQxNGNfdSwKICAgICAgICAgICAgY29sb3IgPSBwbSksIAogICAgICAgIHdpZHRoID0gLjUpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAodHlwZSkiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKGluYykiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIChpbmMpIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoaW5jKSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKGJ1bGspIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGJ1bGspIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKGJ1bGspIiA9IDE3KSkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICAgIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICB4bGFiKCJZZWFyIikgKwogICAgZ2d0aXRsZSgiQnVsay9pbmMgMTAtMjAgY20iKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCmdnc2F2ZSgic3JhLnRzLnBwd2YyMC5ibGsuaW5jLnBkZiIsIHAsIGRwaSA9IDMwMCwgd2lkdGggPSA2Ljk3LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIpCiMgaW5jL2J1bGsgcHJvZmlsZXMKcCA8LSBzcmEuMTkuMDEuMDkgJT4lCiAgZmlsdGVyKGx5cl9ib3QgPCAzMSkgJT4lCiAgc2VsZWN0KFllYXIsIFBNLCBFQ08sIFBNZWNvLCBseXJfYm90LCBkMTRjLCBkMTRjX3NkKSAlPiUKICBtdXRhdGUoVHlwZSA9ICJidWxrIiwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoWWVhcikpKSAlPiUKICBzZWxlY3QoLWQxNGNfc2QpICU+JQogIGJpbmRfcm93cyguLAogICAgICAgICAgICBzcmEuMTkuMDEuaW5jICU+JQogICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBQTSwgRUNPLCBQTWVjbywgbHlyX2JvdCwgZDE0YywgZDE0Y19taW4sIGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICByZW5hbWUoZDE0Y19sID0gZDE0Y19taW4sCiAgICAgICAgICAgICAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoVHlwZSA9ICJpbmMiKQogICkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvVHlwZSA9IHBhc3RlMChlY28sICIgKCIsIFR5cGUsICIpIikpCmdnc2F2ZSgic3JhLnRzLnBwd2YyMC5ibGsucGRmIiwgcCwgZHBpID0gMzAwLCB3aWR0aCA9IDYuOTcsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIikKYGBgCgpgYGB7ciBTQUItbW9kZml0c30KIyMjIFJ1biBtb2RmaXQKIyMgMTRDIGJ1bGsgb25seQojIDAtMTAKbW9kLnNlbnMuZml0cy4ycHMuMTBiIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45OTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMTBiKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4xMGIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjEwYiIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAwNSwgLjAwMDEsIC4wMDA0KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIHNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzBiLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDE0QyAoYnVsayArIHJlc3ApCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMGJyIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45OTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4xMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4xMGJyLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4xMGJyIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCiMgMTAtMjAsIGxhZyA9IDUKbW9kLnNlbnMuZml0cy4ycHMuMjBici5sIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjIwYnIubCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMjBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMjBici5sLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4yMGJyLmwiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyAjIDIwLTMwCiMgbW9kLnNlbnMuZml0cy4ycHMuMzBiciA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xNSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDA1LCAuMDAwMSwgLjAwMDQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyIpCiMgbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMzBicikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCiMgc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMGJyLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGJyIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCiMgbW9kLmZpdHMuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwYnIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDE0QyBidWxrICsgc3RvY2tzCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMGJzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45OTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMTBicykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTBicyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMuMTBicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZnVuY3Rpb24oeCkgeFtbMV1dKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAwNSwgLjAwMDEsIC4wMDA0KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIHNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzBiLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIDE0QyArIGNTdG9jayAoMTRDIHJlc3AsIDE0QyBidWxrLCBzdG9ja3MpCiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMHJicyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4xMHJicykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMTByYnMsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjEwcmJzIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcy4xMHJicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTByYnMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAxMC0yMAojIHcvbyBsYWcKbW9kLnNlbnMuZml0cy4ycHMuMjByYnMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDIsIC4wMDAxLCAuMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4yMHJicywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMjByYnMiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyB3LyBsYWcgPSAxMgptb2Quc2Vucy5maXRzLjJwcy4yMHJicy5sIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMjByYnMubCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMjBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMjByYnMubCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMjByYnMubCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAwNSwgLjAwMDEsIC4wMDA0KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayBvbmx5IikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIHNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzBiLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4zMGIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKYGBgCgpgYGB7ciBTQUItbW9kLWZpdHN9CiMgU0FCIGZpdHMKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcy4xMGJfMjAyMS0wNC0wNy5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuMTBicl8yMDIxLTA0LTA3LlJkYXRhIikKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcy4xMGJzXzIwMjEtMDQtMDcuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLjEwcmJzXzIwMjEtMDQtMDcuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLjIwcmJzXzIwMjEtMDQtMTIuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLjIwcmJzLmxfMjAyMS0wNC0xMy5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuMjBici5sXzIwMjEtMDQtMTMuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwc18yMDIxLTA0LTA2LlJkYXRhIikKCiMgZXh0cmFjdCBtb2QgZml0cwptb2QuZml0cy4ycHMuMTBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMGIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuMnBzLjEwYnMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwYnMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuMnBzLjEwYnIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwYnIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuMnBzLjEwcmJzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMHJicywgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4ycHMuMjByYnMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLCBmdW5jdGlvbih4KSB4W1sxXV0pCm1vZC5maXRzLjJwcy4yMHJicy5sIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4yMHJicy5sLCBmdW5jdGlvbih4KSB4W1sxXV0pCm1vZC5maXRzLjJwcy4yMGJyLmwgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwYnIubCwgZnVuY3Rpb24oeCkgeFtbMV1dKSAKICAKIyBTZW5zaXRpdml0eS9JZGVudGlmaWFiaWxpdHkKIyMjIyMKIyBleHRyYWN0IGF0IHNlbnNGdW4gb3V0cHV0CnNlbnMuMnBzLjEwYiA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBiLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzLjEwYnIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwYnIsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMuMTBicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcy4xMHJicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTByYnMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMuMjByYnMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzLjIwcmJzLmwgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLmwsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMuMjBici5sIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4yMGJyLmwsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKCiMgcGxvdCBzZW5zaXRpdml0eQpsYXBwbHkoc2Vucy4ycHMuMTBiLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKbGFwcGx5KHNlbnMuMnBzLjEwYnIsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpsYXBwbHkoc2Vucy4ycHMuMTBicywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgInJlc3AiKSkpCmxhcHBseShzZW5zLjJwcy4xMHJicywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgInJlc3AiKSkpCgojIGxvb2sgYXQgaWRlbnRpZmlhYmlsaXR5CmlkZW4uMnBzLjEwYiA8LSBpbmRlbi5kZi5meChzZW5zLjJwcy4xMGIsIG1vZCA9ICIycHMiKQppZGVuLjJwcy4xMGJyIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjEwYnIsIG1vZCA9ICIycHMiKQppZGVuLjJwcy4xMGJzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjEwYnMsIG1vZCA9ICIycHMiKQppZGVuLjJwcy4xMHJicyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcy4xMHJicywgbW9kID0gIjJwcyIpCmlkZW4uMnBzLjIwcmJzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjIwcmJzLCBtb2QgPSAiMnBzIikKaWRlbi4ycHMuMjByYnMubCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcy4yMHJicy5sLCBtb2QgPSAiMnBzIikKaWRlbi4ycHMuMjBici5sIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjIwYnIubCwgbW9kID0gIjJwcyIpCgojIHBsb3QKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcy4xMGJzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcy4xMGJzW1tpXV0sIG1vZCA9ICIycHMiLCAKICAgICAgICAgICAgICAgbmFtZXMoaWRlbi4ycHMuMTBicylbaV0sIAogICAgICAgICAgICAgICBtYXgoaWRlbi4ycHMuMTBic1tbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMuMTBiciksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHMuMTBicltbaV1dLCBtb2QgPSAiMnBzIiwgCiAgICAgICAgICAgICAgIG5hbWVzKGlkZW4uMnBzLjEwYnIpW2ldLCAKICAgICAgICAgICAgICAgbWF4KGlkZW4uMnBzLjEwYnJbW2ldXVsiY29sbGluZWFyaXR5Il0pKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzLjEwcmJzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcy4xMHJic1tbaV1dLCBtb2QgPSAiMnBzIiwgCiAgICAgICAgICAgICAgIG5hbWVzKGlkZW4uMnBzLjEwcmJzKVtpXSwgCiAgICAgICAgICAgICAgIG1heChpZGVuLjJwcy4xMHJic1tbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMuMjByYnMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzLjIwcmJzW1tpXV0sIG1vZCA9ICIycHMiLCAKICAgICAgICAgICAgICAgbmFtZXMoaWRlbi4ycHMuMjByYnMpW2ldLCAKICAgICAgICAgICAgICAgbWF4KGlkZW4uMnBzLjIwcmJzW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcy4yMHJicy5sKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcy4yMHJicy5sW1tpXV0sIG1vZCA9ICIycHMiLCAKICAgICAgICAgICAgICAgbmFtZXMoaWRlbi4ycHMuMjByYnMubClbaV0sIAogICAgICAgICAgICAgICBtYXgoaWRlbi4ycHMuMjByYnMubFtbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMuMjBici5sKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcy4yMGJyLmxbW2ldXSwgbW9kID0gIjJwcyIsIAogICAgICAgICAgICAgICBuYW1lcyhpZGVuLjJwcy4yMGJyLmwpW2ldLCAKICAgICAgICAgICAgICAgbWF4KGlkZW4uMnBzLjIwYnIubFtbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCiMjIyMjCgojIEV4dHJhY3Qgb3B0aW1pemVkIHBhcnMgZnJvbSBtb2RmaXQgb3V0cHV0CiMjIyMjCiMjIGJ1bGsgMTRjIG9ubHkKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4xMGIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMzBiLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgcmVzcCArIGJ1bGsgMTRjCiMgMC0xMApwYXJzLmZpdC4ycHMuMTBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwYnIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KIyAxMC0yMCB3LyBsYWcgPSA1eQpwYXJzLmZpdC4ycHMuMjBici5sIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMjBici5sLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMuMjBici5sKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0KIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGJyLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIGJ1bGsgMTRjICsgc3RvY2tzCiMgMC0xMApwYXJzLmZpdC4ycHMuMTBicyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwYnMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMGJzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGJyLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIHJlc3AsIGJ1bGsgMTRjLCBzdG9ja3MKIyAwLTEwCnBhcnMuZml0LjJwcy4xMHJicyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwcmJzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMuMTByYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojIDEwLTIwCnBhcnMuZml0LjJwcy4yMHJicyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjIwcmJzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHMuMjByYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjIwXQojIDEwLTIwIHcvIGxhZyA9IDEyeQpwYXJzLmZpdC4ycHMuMjByYnMubCA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjIwcmJzLmwsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4yMHJicy5sKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0KIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGJyLCAiW1siLCAxKQojIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KIyMjIyMKCiMgU09DIHN0b2NrcwojIyMjIwojIHcvbyBzdG9jayBjb25zdHJhaW50Cm1vZC5zb2NzLjJwcy4xMGIubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTBiKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzLjEwYltbaV1dLCBpbi5lc3RbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzLjEwYi5scykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwYikKbW9kLnNvY3MuMnBzLjEwYnIubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTBiciksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwcy4xMGJyW1tpXV0sIGluLmVzdFtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMuMTBici5scykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwYnIpCnNvY3MuMnBzLjEwYnIubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KG1vZC5zb2NzLjJwcy4xMGJyLmxzLCBjb2xTdW1zKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCiMgdy8gc3RvY2sgY29uc3RyYWludAptb2Quc29jcy4ycHMuMTBicy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGJzKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzLjEwYnNbW2ldXSwgaW4uZXN0W1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcy4xMGJzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBicykKbW9kLnNvY3MuMnBzLjEwcmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwcmJzKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzLjEwcmJzW1tpXV0sIGluLmVzdFtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMuMTByYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMHJicykKbW9kLnNvY3MuMnBzLjIwcmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjIwcmJzKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzLjIwcmJzW1tpXV0sIGluLmVzdFtpeC4yMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzLjIwcmJzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMjByYnMpCnNvY3MuMnBzLjEwcmJzLmxzIDwtIG1hcHBseShjYmluZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NvYy4xOS4wXzMwW2l4LjEwXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2Quc29jcy4ycHMuMTByYnMubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkKCiMjIG1ha2UgZGYgZm9yIHBsb3R0aW5nCiMgcmVzcCArIGJ1bGssIHcvIGFuZCB3L28gc3RvY2tzCm1vZC5zb2NzLjJwcy4xMGJycmJzLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHMgdy9vIHN0b2NrIiwgbW9kLnNvY3MuMnBzLjEwYnIubHMsIGMoImZhc3QiLCAic2xvdyIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcyB3LyBzdG9jayIsIG1vZC5zb2NzLjJwcy4xMHJicy5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkYXRhLmZyYW1lKFNPQyA9IHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgNCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHBhc3RlMCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNzb2MuMTkuMF8zMFtpeC4xMF0sICJbWyIsIDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgMykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgPSAibWVhc3VyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gInRvdGFsIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQojIGJ1bGsgKyBzdG9jaywgdnMuIHJlc3AsIGJ1bGssICsgc3RvY2sKbW9kLnNvY3MuMnBzLjEwYnNyYnMuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcyBidWxrICsgc3RvY2sgb25seSIsIG1vZC5zb2NzLjJwcy4xMGJzLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG1vZC5zb2NzLmRmLmZ4KCIycHMgYnVsaywgcmVzcCwgKyBzdG9jayIsIG1vZC5zb2NzLjJwcy4xMHJicy5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkYXRhLmZyYW1lKFNPQyA9IHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgNCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHBhc3RlMCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNzb2MuMTkuMF8zMFtpeC4xMF0sICJbWyIsIDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgMykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgPSAibWVhc3VyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gInRvdGFsIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKCiMjIHBsb3QKbW9kLnNvY3MuMnBzLjEwYnJyYnMuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKbW9kLnNvY3MuMnBzLjEwYnNyYnMuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyMjIyMKCiMjIyBTdW1tYXJpemUgb3B0aW1pemVkIHBhciBkYXRhIGZvciBwbG90dGluZwojIyBidWxrIDE0YyBvbmx5CiMgMC0xMApwYXJzLmZpdC4ycHMuMTBiLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4xMGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYi5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMzBiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIyByZXNwICsgYnVsayAxNGMKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGJyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwYnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojIDEwLTIwCnBhcnMuZml0LjJwcy4yMGJyLmwuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMjBici5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4zMGJyLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMzBdKQoKIyMgYnVsayAxNGMgKyBzdG9ja3MKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGJzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBici5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjMwYnIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIyByZXNwLCBidWxrLCBzdG9ja3MKIyAwLTEwCnBhcnMuZml0LjJwcy4xMHJicy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4xMHJicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgMTAtMjAKcGFycy5maXQuMnBzLjIwcmJzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjIwcmJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjIwXSkKIyB3LyBsYWcKcGFycy5maXQuMnBzLjIwcmJzLmwuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMjByYnMubCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4yMF0pCiMgIyAyMC0zMAojIHBhcnMuZml0LjJwcy4zMGJyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMzBiciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCiMjIyBQYXIgZml0cwpwYXIucGxvdC5meChtb2QgPSAiMnBzIGJ1bGsgMTRjIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4xMGIuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcyByZXNwICsgYnVsayAxNGMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjEwYnIuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcyBidWxrIDE0YyArIHN0b2NrcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMTBicy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AsIGJ1bGssIHN0b2NrcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMTByYnMuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcyByZXNwLCBidWxrLCBzdG9ja3MiLAogICAgICAgICAgICBkZXB0aCA9ICIxMC0yMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4yMHJicy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AsIGJ1bGssIHN0b2NrcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjEwLTIwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjIwcmJzLmwuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcyByZXNwLCBidWxrIiwKICAgICAgICAgICAgZGVwdGggPSAiMTAtMjAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMjBici5sLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgcGFyLnBsb3QuZngobW9kID0gIjJwcyBidWxrIDE0YyIsCiMgICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAojICAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4zMGIuZGYsCiMgICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQojIHBhci5wbG90LmZ4KG1vZCA9ICIycHMgcmVzcCArIGJ1bGsgMTRjIiwKIyAgICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiMgICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjMwYnIuZGYsCiMgICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQoKIyMjIEZpdCBtb2RlbHMgd2l0aCBvcHRpbWl6ZWQgcGFycwojIyBidWxrIDE0QyBvbmx5CiMgMC0xMApUd29wcy4xMGIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGIpLCBmdW5jdGlvbihpKSB7CiAgdHJ5Q2F0Y2goCiAgICBwYXIuZngocGFycy5maXQuMnBzLjEwYltbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhUd29wcy4xMGIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwYikKIyAjIDIwLTMwCiMgVHdvcHMuMzBiLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMzBiKSwgZnVuY3Rpb24oaSkgewojICAgdHJ5Q2F0Y2goCiMgICAgIHBhci5meChwYXJzLmZpdC4ycHMuMzBiW1tpXV0sIGluLmVzdFtpeC4zMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKIyAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKIyB9KQojIG5hbWVzKFR3b3BzLjMwYi5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMzBiKQoKIyMgcmVzcCArIGJ1bGsgMTRDCiMgMC0xMApUd29wcy4xMGJyLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTBiciksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMTBicltbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhUd29wcy4xMGJyLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMGJyKQojIDEwLTIwClR3b3BzLjIwYnIubC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjIwYnIubCksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMjBici5sW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKFR3b3BzLjIwYnIubC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMjBici5sKQojICMgMjAtMzAKIyBUd29wcy4zMGJyLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMzBiciksIGZ1bmN0aW9uKGkpIHsKIyAgIHRyeUNhdGNoKAojICAgICBwYXIuZngocGFycy5maXQuMnBzLjMwYnJbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAojICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQojIH0pCiMgbmFtZXMoVHdvcHMuMzBici5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMzBicikKCiMjIGJ1bGsgMTRDICsgc3RvY2tzCiMgMC0xMApUd29wcy4xMGJzLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTBicyksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMTBic1tbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhUd29wcy4xMGJzLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMGJzKQoKIyMgcmVzcCwgYnVsaywgc3RvY2tzCiMgMC0xMApUd29wcy4xMHJicy5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwcmJzKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4xMHJic1tbaV1dLCBpbi5lc3RbaXguMTBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhUd29wcy4xMHJicy5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTByYnMpCiMgMTAtMjAKVHdvcHMuMjByYnMuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4yMHJicyksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMjByYnNbW2ldXSwgaW4uZXN0W2l4LjIwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMjByYnMuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjIwcmJzKQoKIyAjIHJlbW92ZSBudWxsIGVudHJpZXMKIyBUd29wcy4xMGIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4xMGIuZml0cykKIyBUd29wcy4zMGIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4zMGIuZml0cykKIyBUd29wcy4xMGJyLmZpdHMgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgVHdvcHMuMTBici5maXRzKQojIFR3b3BzLjMwYnIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4zMGJyLmZpdHMpCgojIExvb2sgYXQgcm9sZSBvZiByZXNwIGNvbnN0cmFpbnQgaW4gZml0CiMgbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMGIuZml0cyksIGZ1bmN0aW9uKGkpIHsKIyAgIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwYi5maXRzW1tpXV0sCiMgICAgICAgICAgICAgICAgICBjb24uZGYgPSBjb24uZGYuZngobmFtZXMoVHdvcHMuMTBiLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgb25seSIsCiMgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYi5maXRzKVtpXSkKIyB9KQpsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjEwYnIuZml0cyksIGZ1bmN0aW9uKGkpIHsKICBDMTQuMnAucGxvdC5meChUd29wcy4xMGJyLmZpdHNbW2ldXSwgCiAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjEwYnIuZml0cylbaV0pLCAKICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyByZXNwIiwKICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYnIuZml0cylbaV0pCn0pCiMgbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMGJzLmZpdHMpLCBmdW5jdGlvbihpKSB7CiMgICBDMTQuMnAucGxvdC5meChUd29wcy4xMGJzLmZpdHNbW2ldXSwKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4xMGJzLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyBzdG9jayIsCiMgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwYnMuZml0cylbaV0pCiMgfSkKbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4xMHJicy5maXRzKSwgZnVuY3Rpb24oaSkgewogIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwcmJzLmZpdHNbW2ldXSwgCiAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpW2ldKSwgCiAgICAgICAgICAgICAgICAgbW9kID0gImJ1bGssIHJlc3AsIHN0b2NrIiwKICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpW2ldKQp9KQojIDEwLTIwCmxhcHBseShzZXFfYWxvbmcoVHdvcHMuMjByYnMuZml0cyksIGZ1bmN0aW9uKGkpIHsKICBDMTQuMnAucGxvdC5meChUd29wcy4yMHJicy5maXRzW1tpXV0sIAogICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4yMHJicy5maXRzKVtpXSksIAogICAgICAgICAgICAgICAgIG1vZCA9ICJidWxrLCByZXNwLCBzdG9jayIsCiAgICAgICAgICAgICAgICAgUE1lY29fZGVwdGggPSBuYW1lcyhUd29wcy4yMHJicy5maXRzKVtpXSkKfSkKIyBsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjMwYi5maXRzKSwgZnVuY3Rpb24oaSkgewojICAgQzE0LjJwLnBsb3QuZngoVHdvcHMuMzBiLmZpdHNbW2ldXSwKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4zMGIuZml0cylbaV0pLCAKIyAgICAgICAgICAgICAgICAgIG1vZCA9ICIycHMgYnVsayBvbmx5IiwKIyAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMzBiLmZpdHMpW2ldKQojIH0pCiMgbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4zMGJyLmZpdHMpLCBmdW5jdGlvbihpKSB7CiMgICBDMTQuMnAucGxvdC5meChUd29wcy4zMGJyLmZpdHNbW2ldXSwgCiMgICAgICAgICAgICAgICAgICBjb24uZGYgPSBjb24uZGYuZngobmFtZXMoVHdvcHMuMzBici5maXRzKVtpXSksIAojICAgICAgICAgICAgICAgICAgbW9kID0gIjJwcyBidWxrICsgcmVzcCIsCiMgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjMwYnIuZml0cylbaV0pCiMgfSkKCiMjIFNob3cgcm9sZSBvZiByZXNwIGluIGNvbnN0cmFpbmluZyBtb2RlbHMKIyBHUndmIDAtMTAKVHdvcC5maXQucGxvdC5meChUd29wcy4xMGJzLmZpdHNbd2hpY2gobmFtZXMoVHdvcHMuMTBicy5maXRzKSA9PSAiR1J3Zl8wLTEwIildLCAKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSwgYnVsayAxNGMgKyBzdG9jayIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjEwcmJzLmZpdHNbd2hpY2gobmFtZXMoVHdvcHMuMTByYnMuZml0cykgPT0gIkdSd2ZfMC0xMCIpXSwKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSwgcmVzcCAmIGJ1bGsgMTRjICsgc3RvY2siKQojIEJTcmYgMC0xMApUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjEwYnIuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMGJyLmZpdHMpID09ICJCU3JmXzAtMTAiKV0sIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AiLCAKICAgICAgICAgICAgICAgICBUd29wcy4xMGIuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMGIuZml0cykgPT0gIkJTcmZfMC0xMCIpXSwKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSB3L28gcmVzcCIpClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTByYnMuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMHJicy5maXRzKSA9PSAiQlNyZl8wLTEwIildLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AsIGJ1bGssIHN0b2NrcyIsCiAgICAgICAgICAgICAgICAgVHdvcHMuMTBicy5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwYnMuZml0cykgPT0gIkJTcmZfMC0xMCIpXSwKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSB3L28gcmVzcCAoYnVsayArIHN0b2NrcyBvbmx5KSIpClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTByYnMuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMHJicy5maXRzKSA9PSAiQlN3Zl8xMC0yMCIpXSwKICAgICAgICAgICAgICAgICAiQmFzYWx0L2Nvb2wgMTAtMjAiLAogICAgICAgICAgICAgICAgIFR3b3BzLjEwcmJzLmZpdHNbd2hpY2gobmFtZXMoVHdvcHMuMTByYnMuZml0cykgPT0gIkdSd2ZfMTAtMjAiKV0sCiAgICAgICAgICAgICAgICAgIkdyYW5pdGUvY29vbCAxMC0yMCIpCgojIGNvbXBhcmUgcmVzcCArIGJ1bGsgZml0cyB3LyBhbmQgdy9vIHN0b2NrcwpUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjEwcmJzLmZpdHMsIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AsIGJ1bGssIHN0b2NrcyIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjEwYnIuZml0cywKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSB3LyByZXNwICsgYnVsaywgbm8gc3RvY2siKQojIGNvbXBhcmUgcmVzcCArIGJ1bGsgZml0cyB3LyBhbmQgdy9vIHN0b2NrcwpUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjEwYnMuZml0cywgCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20sIGJ1bGsgMTRjICsgc3RvY2siLCAKICAgICAgICAgICAgICAgICBUd29wcy4xMHJicy5maXRzLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtLCByZXNwICYgYnVsayAxNGMgKyBzdG9jayIpCiMgY29tcGFyZSBCU3dmIGFuZCBHUndmIDEwLTIwCkJTR1J3ZjIwLmNvbi5kZiA8LSBjYmluZChyYmluZChjb24uZGYuZngoIkJTd2ZfMTAtMjAiKSwgY29uLmRmLmZ4KCJHUndmXzEwLTIwIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0gPSBmYWN0b3IocmVwKGMoImJhc2FsdCIsICJncmFuaXRlIiksIGVhY2ggPSBjKDExKSkpKQpCU0dSd2YyMC5jb24uZGYgPC0gQlNHUndmMjAuY29uLmRmWy13aGljaChCU0dSd2YyMC5jb24uZGYkWWVhciA9PSAyMDA5LjUpLCBdCkFOR1J3ZjIwLmNvbi5kZiA8LSBjYmluZChyYmluZChjb24uZGYuZngoIkJTd2ZfMTAtMjAiKSwgY29uLmRmLmZ4KCJHUndmXzEwLTIwIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0gPSBmYWN0b3IocmVwKGMoImJhc2FsdCIsICJncmFuaXRlIiksIGVhY2ggPSBjKDExKSkpKQpCU0dSd2YyMC5jb24uZGYgPC0gQlNHUndmMjAuY29uLmRmWy13aGljaChCU0dSd2YyMC5jb24uZGYkWWVhciA9PSAyMDA5LjUpLCBdCmF0bS4xNGMyIDwtIFR3b3BzLjIwcmJzLmZpdHMkYEJTd2ZfMTAtMjBgW1R3b3BzLjIwcmJzLmZpdHMkYEJTd2ZfMTAtMjBgJHllYXJzID49IDE5NTAgJiBUd29wcy4yMHJicy5maXRzJGBCU3dmXzEwLTIwYCRwb29sID09ICJhdG0iLCBdCiMgcGxvdApwIDwtIHJiaW5kKFR3b3BzLjIwcmJzLmZpdHMkYEJTd2ZfMTAtMjBgLAogICAgICBUd29wcy4yMHJicy5maXRzJGBHUndmXzEwLTIwYCkgJT4lCiAgbXV0YXRlKHBtID0gcmVwKGMoImJhc2FsdCIsICJncmFuaXRlIiksIAogICAgICAgICAgICAgICAgICBlYWNoID0gbnJvdyhUd29wcy4yMHJicy5maXRzJGBCU3dmXzEwLTIwYCkpKSAlPiUKICBmaWx0ZXIocG9vbCA9PSAiYnVsayBDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKICBnZW9tX3BhdGgoZGF0YSA9IGF0bS4xNGMyKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IHBvb2wsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV9wb2ludChkYXRhID0gQlNHUndmMjAuY29uLmRmLCAKICAgICAgICAgICAgIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBtLCBzaGFwZSA9IHBvb2wpLCAKICAgICAgICAgICAgIHNpemUgPSAyLjUsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICB2YWx1ZXMgPSBjKCJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYnVsayBDIiA9IDE2LAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gMSkpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwoCiAgIG5hbWUgPSAiUG9vbCIsCiAgIHZhbHVlcyA9IGMoImJ1bGsgQyIgPSAxLAogICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmdnc2F2ZSgic3JhLjJwcy5CU0dSd2YyMC5wZGYiLCBwLCBkcGkgPSAzMDAsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iKQojIGNvbXBhcmUgcmVzcCArIGJ1bGsgZml0cyB3LyBhbmQgdy9vIHN0b2NrcwpUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjIwYnIubC5maXRzLCAKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSwgYnVsayAxNGMgKyBzdG9jayIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjIwcmJzLmZpdHMsCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20sIHJlc3AgJiBidWxrIDE0YyArIHN0b2NrIikKIyMjIyMKCiMgYWdlcyBhbmQgdHJhbnNpdCB0aW1lcwojIyMjIwojIDJwcwpTQS4ycHMuMjAucmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjIwcmJzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcy4yMHJic1tbaV1dWzE6Ml0KICB0YyA8LSBwYXJzLmZpdC4ycHMuMjByYnNbW2ldXVszXQogIEluIDwtIGluLmVzdFtpeC4yMF1bW2ldXQogIEEgPC0gZGlhZygta3MpCiAgQVsyLCAxXSA8LSB0YyAqIGtzWzFdCiAgcmV0dXJuKHN5c3RlbUFnZShBID0gQSwgdSA9IGMoSW4sIDApKSkKfSkKbmFtZXMoU0EuMnBzLjIwLnJicy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzLjIwcmJzKQpsYXBwbHkoU0EuMnBzLjIwLnJicy5scywgIltbIiwgMSkKCiMjIFRyYW5zaXQgdGltZQojIDJwcwpUVC4ycHMuMjAucmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjIwcmJzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcy4yMHJic1tbaV1dWzE6Ml0KICB0YyA8LSBwYXJzLmZpdC4ycHMuMjByYnNbW2ldXVszXQogIEluIDwtIGluLmVzdFtpeC4yMF1bW2ldXQogIEEgPC0gZGlhZygta3MpCiAgQVsyLCAxXSA8LSB0YyAqIGtzWzFdCiAgcmV0dXJuKHRyYW5zaXRUaW1lKEEgPSBBLCB1ID0gYyhJbiwgMCkpKQp9KQpuYW1lcyhUVC4ycHMuMjAucmJzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMjByYnMpCmxhcHBseShUVC4ycHMuMjAucmJzLmxzLCAiW1siLCAxKQojIDAtMTAKVFQuTUEuMnBzLjEwLnJicy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMHJicyksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHMuMTByYnNbW2ldXVsxOjJdCiAgdGMgPC0gcGFycy5maXQuMnBzLjEwcmJzW1tpXV1bM10KICBJbiA8LSBpbi5lc3RbaXguMTBdW1tpXV0KICBBIDwtIGRpYWcoLWtzKQogIEFbMiwgMV0gPC0gdGMgKiBrc1sxXQogIFRUIDwtIHRyYW5zaXRUaW1lKEEgPSBBLCB1ID0gYyhJbiwgMCkpCiAgQWdlIDwtIHN5c3RlbUFnZShBID0gQSwgdSA9IGMoSW4sIDApKQogIHJldHVybihsaXN0KFRUID0gVFQkbWVhblRyYW5zaXRUaW1lLCBBZ2UgPSBBZ2UkbWVhblN5c3RlbUFnZSkpCn0pCm5hbWVzKFRULk1BLjJwcy4xMC5yYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMHJicykKbGFwcGx5KFRULk1BLjJwcy4xMC5yYnMubHMsIHVubGlzdCkKIyAKYWdlRC4ycHMuMTAucmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwcmJzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcy4xMHJic1tbaV1dWzE6Ml0KICB0YyA8LSBwYXJzLmZpdC4ycHMuMTByYnNbW2ldXVszXQogIEluIDwtIGluLmVzdFtpeC4xMF1bW2ldXQogIEEgPC0gZGlhZygta3MpCiAgQVsyLCAxXSA8LSB0YyAqIGtzWzFdCiAgcmV0dXJuKHN5c3RlbUFnZShBID0gQSwgdSA9IGMoSW4sIDApKSkKfSkKbmFtZXMoYWdlRC4ycHMuMTAucmJzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTByYnMpCmBgYAoKYGBge3IgbW9kRml0LTJwLWNvbXBhcmlzb259CiMgY29tcGFyZSBvdXRwdXQgb2YgMnBwIGFuZCAycHMgbW9kZWwgZml0cwptZXJnZShzc3IuMnBwLmRmLCBzc3IuMnBzLmRmLCBieSA9ICJQTWVjb19kZXB0aCIsIHN1ZmZpeGVzID0gYygiXzJwcCIsICJfMnBzIikpICU+JQogIG11dGF0ZShzc3JfMnBwID0gcm91bmQoc3NyXzJwcCwgMSksCiAgICAgICAgIHNzcl8ycHMgPSByb3VuZChzc3JfMnBzLCAxKSwKICAgICAgICAgZGlmID0gc3NyXzJwcCAtIHNzcl8ycHMpCm1lcmdlKHZhcl9tcy4ycHAuZGYsCiAgICAgIHZhcl9tcy4ycHMuZGYsCiAgICAgIGJ5ID0gYygiUE1lY29fZGVwdGgiLCAidmFyIiksCiAgICAgIHN1ZmZpeGVzID0gYygiXzJwcCIsICJfMnBzIikpICU+JQogIG11dGF0ZSh2YXJfbXNfMnBwID0gcm91bmQodmFyX21zXzJwcCwgNCksCiAgICAgICAgIHZhcl9tc18ycHMgPSByb3VuZCh2YXJfbXNfMnBzLCA0KSwKICAgICAgICAgZGlmID0gdmFyX21zXzJwcCAtIHZhcl9tc18ycHMpCgojIyBQbG90CiMgU1NSLCBQTQpyYmluZChzc3IuMnBwLmRmLCBzc3IuMnBzLmRmKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IG5yb3coc3NyLjJwcC5kZikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCkpICU+JQogIGdyb3VwX2J5KFBNLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnNzciA9IG1lYW4oc3NyKSwgc2QgPSBzZChzc3IpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnNzciArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi5zc3IgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi5zc3IsIGZpbGwgPSBQTSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBQTSkgKwogIGdndGl0bGUoIlNTUiAyLXBvb2wgbW9kZWxzIDAtMTAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyBTU1IsIGVjbwpyYmluZChzc3IuMnBwLmRmLCBzc3IuMnBzLmRmKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IG5yb3coc3NyLjJwcC5kZikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCkpICU+JQogIGdyb3VwX2J5KGVjbywgbW9kKSAlPiUKICBzdW1tYXJpemUobWVhbi5zc3IgPSBtZWFuKHNzciksIHNkID0gc2Qoc3NyKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbi5zc3IgKyBzZC9zcXJ0KDMpLAogICAgICAgICBlcnJfbCA9IG1lYW4uc3NyIC0gc2Qvc3FydCgzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtb2QsIG1lYW4uc3NyLCBmaWxsID0gZWNvKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgICB3aWR0aCA9IC4zKSArCiAgZmFjZXRfd3JhcCguIH4gZWNvKSArCiAgZ2d0aXRsZSgiU1NSIDItcG9vbCBtb2RlbHMgMC0xMCBjbSAoZWNvKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyB2YXJfbXMsIFBNCnJiaW5kKHZhcl9tcy4ycHAuZGYsIHZhcl9tcy4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyh2YXJfbXMuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkodmFyLCBQTSwgbW9kKSAlPiUKICBzdW1tYXJpemUobWVhbi52YXJfbXMgPSBtZWFuKHZhcl9tcyksIHNkID0gc2QodmFyX21zKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbi52YXJfbXMgKyBzZC9zcXJ0KDMpLAogICAgICAgICBlcnJfbCA9IG1lYW4udmFyX21zIC0gc2Qvc3FydCgzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtb2QsIG1lYW4udmFyX21zLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAgIHdpZHRoID0gLjMpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gdmFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZ3RpdGxlKCJSZXNpZHVhbCBlcnJvciAyLXBvb2wgbW9kZWxzIDAtMTAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyB2YXJfbXMsIGVjbwpyYmluZCh2YXJfbXMuMnBwLmRmLCB2YXJfbXMuMnBzLmRmKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IG5yb3codmFyX21zLjJwcC5kZikpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIGVjbyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCkpICU+JQogIGdyb3VwX2J5KHZhciwgZWNvLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnZhcl9tcyA9IG1lYW4odmFyX21zKSwgc2QgPSBzZCh2YXJfbXMpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnZhcl9tcyArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi52YXJfbXMgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi52YXJfbXMsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAgIHdpZHRoID0gLjMpICsKICBmYWNldF93cmFwKC4gfiB2YXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIlJlc2lkdWFsIGVycm9yIDItcG9vbCBtb2RlbHMgMC0xMCBjbSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGFnZXMtdHQtbW9kRml0fQojIyBTeXN0ZW0gYWdlCiMgMnBwClNBLjJwcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHBbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwcFtbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwcFtbaV1dCiAgcmV0dXJuKHN5c3RlbUFnZSgsIHUgPSBJbikpCn0pCm5hbWVzKFNBLjJwcC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KU0EuMnBwLnAzLjUuOTUubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHAucDMuNS45NVtbaV1dCiAgcmV0dXJuKHN5c3RlbUFnZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFNBLjJwcC5wMy41Ljk1LmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkKIyAycHMKU0EuMnBzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwc1tbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBzW1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBzW1tpXV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoU0EuMnBzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpCgojIyBUcmFuc2l0IHRpbWUKIyAycHAKVFQuMnBwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcFtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwW1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBwW1tpXV0KICByZXR1cm4odHJhbnNpdFRpbWUoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhUVC4ycHAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKIyAycHAgZ2FtID0gWy41LCAuOTVdClRULjJwcC5wMy41Ljk1LmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwLnAzLjUuOTUpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXVsxOjJdCiAgZ2FtIDwtIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBwLnAzLjUuOTVbW2ldXQogIHJldHVybih0cmFuc2l0VGltZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFRULjJwcC5wMy41Ljk1LmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkKIyAycHMKVFQuMnBzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwc1tbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBzW1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBzW1tpXV0KICByZXR1cm4odHJhbnNpdFRpbWUoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhUVC4ycHMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKYGBgCgpgYGB7ciBTQS1UVC1jb21wfQojIGNvbXBhcmUgYWdlcyBhbmQgdHJhbnNpdCB0aW1lcyBhbW9uZyB0aGUgdHdvIG1vZGVsIHN0cnVjdHVyZXMKU0EuMnAubHMgPC0gbGlzdChTQS4ycHAubHMsIFNBLjJwcy5scywgU0EuMnBwLnAzLjUuOTUubHMpClNBLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoU0EuMnAubHMsIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oaSkgewogICAgICBkYXRhLmZyYW1lKGFnZSA9IGMobHNbW2ldXVtbIm1lYW5TeXN0ZW1BZ2UiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBsc1tbaV1dW1sibWVhblBvb2xBZ2UiXV0pLAogICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGMoInN5c3RlbSIsICJmYXN0IHBvb2wiLCAic2xvdyBwb29sIikpCiAgICB9KQogIH0pCikKU0EuZGYkUE1lY29fZGVwdGggPC0gcmVwKG5hbWVzKFNBLjJwcC5scyksIGVhY2ggPSAzLCB0aW1lcyA9IGxlbmd0aChTQS4ycC5scykpClNBLmRmJE1vZGVsIDwtIHJlcChjKCIycHAiLCAiMnBzIiwgIjJwcCBbLjUsIC45NV0iKSwgZWFjaCA9IDI3KQpUVC4ycC5scyA8LSBsaXN0KFRULjJwcC5scywgVFQuMnBzLmxzLCBUVC4ycHAucDMuNS45NS5scykKVFQuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShUVC4ycC5scywgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICAgZGF0YS5mcmFtZShhZ2UgPSBsc1tbaV1dW1sibWVhblRyYW5zaXRUaW1lIl1dLAogICAgICAgICAgICAgICAgY29tcG9uZW50ID0gInRyYW5zaXQiKQogICAgfSkKICB9KQopClRULmRmJFBNZWNvX2RlcHRoIDwtIHJlcChuYW1lcyhUVC4ycHAubHMpLCB0aW1lcyA9IGxlbmd0aChUVC4ycC5scykpClRULmRmJE1vZGVsIDwtIHJlcChjKCIycHAiLCAiMnBzIiwgIjJwcCBbLjUsIC45NV0iKSwgZWFjaCA9IDkpClNBLlRULmRmIDwtIHJiaW5kKFNBLmRmLCBUVC5kZikKU0EuVFQuZGYkUE0gPC0gc3Vic3RyKFNBLlRULmRmJFBNZWNvX2RlcHRoLCBzdGFydCA9IDEsIHN0b3AgPSAyKQpTQS5UVC5kZiRlY28gPC0gc3Vic3RyKFNBLlRULmRmJFBNZWNvX2RlcHRoLCBzdGFydCA9IDMsIHN0b3AgPSA0KQoKIyMgUGxvdCBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzCiMgYnkgUE0KU0EuVFQuZGYgJT4lCiAgc2VsZWN0KCFjKFBNZWNvX2RlcHRoLCBlY28pKSAlPiUKICBncm91cF9ieShjb21wb25lbnQsIFBNLCBNb2RlbCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW5fYWdlID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW5fYWdlICsgc2QsCiAgICAgICAgIGVycl9sID0gbWVhbl9hZ2UgLSBzZCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhNb2RlbCwgbWVhbl9hZ2UsIGZpbGwgPSBQTSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAjIGdlb21fZXJyb3JiYXIoCiAgIyAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICMgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICMgICB3aWR0aCA9IC4zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IGNvbXBvbmVudCwgc2NhbGVzID0gImZyZWUiKSArCiAgeWxhYigibWVhbiBhZ2UiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyBieSBlY28KU0EuVFQuZGYgJT4lCiAgc2VsZWN0KCFjKFBNZWNvX2RlcHRoLCBQTSkpICU+JQogIGdyb3VwX2J5KGNvbXBvbmVudCwgZWNvLCBNb2RlbCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW5fYWdlID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW5fYWdlICsgc2QsCiAgICAgICAgIGVycl9sID0gbWVhbl9hZ2UgLSBzZCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhNb2RlbCwgbWVhbl9hZ2UsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgIyBnZW9tX2Vycm9yYmFyKAogICMgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLAogICMgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICMgICB3aWR0aCA9IC4zKSArCiAgZmFjZXRfd3JhcCguIH4gY29tcG9uZW50LCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKCJtZWFuIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyBCYXllc2lhbiBwYXJhbWV0ZXIgZXN0aW1hdGlvbiAoTUNNQykKCmBgYHtyIE1DTUMtZml0cywgZXZhbCA9IEZBTFNFfQojIHRoZSBmb2xsb3dpbmcgLlJEYXRhIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgc2NyaXB0ICJzcmEtdHMvc291cmNlL3NyYS10cy1tY21jLWJheWVzLlIiCmxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTA2L2JheWVzX2ZpdF8ycHBfMC0xMF81MDAwaXRlci5SRGF0YSIpCmxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTE3L2JheWVzX2ZpdF8ycHNfMC0xMF81MDAwaXRlci5SRGF0YSIpCgojICMgcGxvdCBwYXJhbWV0ZXIgY29udmVyZ2VuY2UKIyBsYXBwbHkoYmF5ZXNfZml0XzJwcF8wXzEwLCBwbG90KQojIGxhcHBseShiYXllc19maXRfMnBzXzBfMTAsIHBsb3QpCgojIHBsb3QgY29sbGluZWFyaXR5Cml0ZXIgPC0gNTAwMApsYXBwbHkoYmF5ZXNfZml0XzJwcF8wXzEwLCBwYWlycywgbnNhbXBsZSA9IGZsb29yKGl0ZXIvNCkpCmxhcHBseShiYXllc19maXRfMnBzXzBfMTAsIHBhaXJzLCBuc2FtcGxlID0gZmxvb3IoaXRlci80KSkKCiMjIGxvb2sgYXQgbW9kZWwgcGVyZm9ybWFuY2UKcGFycy5iYXllcy5kZi5meCA8LSBmdW5jdGlvbihtb2QsIHBhcnMuYmF5ZXMsIHBhcnMuZml0KSB7CiAgYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcocGFycy5iYXllcyksIGZ1bmN0aW9uKGkpIHsKICAgIGl4IDwtIG1hdGNoKHVuaXF1ZShwYXJzLmJheWVzW1tpXV1bWyJwYXJzIl1dWywgMV0pLCBwYXJzLmJheWVzW1tpXV1bWyJwYXJzIl1dWywgMV0pCiAgICBkZiA8LSBkYXRhLmZyYW1lKGsxID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgMV0sCiAgICAgICAgICAgICAgICAgICAgIGsyID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgMl0sCiAgICAgICAgICAgICAgICAgICAgIHAzID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgM10pCiAgICBkZiA8LSBjYmluZChkZiwKICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gcmVwKG5hbWVzKHBhcnMuZml0KVtpXSwgbGVuZ3RoKGl4KSksCiAgICAgICAgICAgICAgICBtb2QgPSByZXAobW9kLCBsZW5ndGgoaXgpKSkKICAgIGRmIDwtIGNiaW5kKGRmLCAKICAgICAgICAgICAgICAgIFBNID0gZmFjdG9yKHN1YnN0cihkZiRQTWVjb19kZXB0aCwgMSwgMikpLAogICAgICAgICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihkZiRQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKQogICAgcmV0dXJuKGRmKQogIH0pKQp9CnBhcnMuYmF5ZXMuMnBwLmRmIDwtIHBhcnMuYmF5ZXMuZGYuZngoIjJwcCIsIGJheWVzX2ZpdF8ycHBfMF8xMCwgcGFycy5maXQuMnBwKQpwYXJzLmJheWVzLjJwcy5kZiA8LSBwYXJzLmJheWVzLmRmLmZ4KCIycHMiLCBiYXllc19maXRfMnBzXzBfMTAsIHBhcnMuZml0LjJwcykKCiMgIyBsaW5lYXIgZml0cwojIHN1bW1hcnkobG0oazIgfiBQTSwgcGFycy5iYXllcy4ycHAuZGYpKQojIHN1bW1hcnkobG0oazIgfiBlY28sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKIyBzdW1tYXJ5KGxtKGsxIH4gUE0sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKIyBzdW1tYXJ5KGxtKGsxIH4gZWNvLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShwMyB+IFBNLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShwMyB+IGVjbywgcGFycy5iYXllcy4ycHAuZGYpKQoKIyBiZXN0IHBhciBzZXQKYmVzdFBhcnMuYmF5ZXMubHMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHBfMF8xMCwgZnVuY3Rpb24oeCkgewogIHJvdW5kKGRhdGEuZnJhbWUoazEgPSB4JGJlc3RwYXJbMV0sCiAgICAgICAgICAgICAgICAgICBrMiA9IHgkYmVzdHBhclsyXSwKICAgICAgICAgICAgICAgICAgIGdhbSA9IHgkYmVzdHBhclszXSksCiAgICAgICAgNCkKfSkKYmVzdFBhcnMuYmF5ZXMuZGYgPC0gY2JpbmQoUE0gPSByZXAoYygiQU4iLCAiQlMiLCAiR1IiKSwgZWFjaCA9IDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlY28gPSByZXAoYygicHAiLCAicmYiLCAid2YiKSwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gcmVwKCIwLTEwIiwgOSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRfcm93cyhiZXN0UGFycy5iYXllcy5scykpCgojIHN1bW1hcml6ZSBieSBQTQpwYXJzLmJheWVzLlBNIDwtIGJlc3RQYXJzLmJheWVzLmRmICU+JQogIHNlbGVjdCghYyhlY28sIGRlcHRoKSkgJT4lCiAgZ3JvdXBfYnkoUE0pICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDMpCiMgc3VtbWFyaXplIGJ5IEVDTwpwYXJzLmJheWVzLmVjbyA8LSBiZXN0UGFycy5iYXllcy5kZiAlPiUKICBzZWxlY3QoIWMoUE0sIGRlcHRoKSkgJT4lCiAgZ3JvdXBfYnkoZWNvKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAzKQoKIyBwbG90IGJlc3QgcGFycwpiZXN0UGFycy5iYXllcy5kZiAlPiUKICBwaXZvdF9sb25nZXIoIShQTTpkZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGNvbG9yID0gUE0sIHNoYXBlID0gZWNvKSkgKwogIGdlb21faml0dGVyKHNpemUgPSA0KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3QgYWNjZXB0ZWQgcGFycyBieSBQTSBhbmQgdGhlbiBieSBlY28KcGFycy5iYXllcy5kZiAlPiUKICBwaXZvdF9sb25nZXIoIWMoUE0sIGVjbywgUE1lY29fZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCnBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCFjKFBNLCBlY28sIFBNZWNvX2RlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgZmlsbCA9IGVjbykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGA=